本系列导航
- 上一篇:第三十二章:前端工具页架构
- 下一篇:第三十四章:AI 模型路由与成本控制
- 返回目录:Birdor 商业计划书目录
本章关键词
后端 API、任务队列、API token、用量统计、批处理、错误码、异步任务、服务边界、版本化 API。
适合阅读的人
- 正在设计 Birdor 后端架构的工程师。
- 需要规划 API 版本、认证、限流和计费系统的人。
- 想把工具站从纯前端扩展到 SaaS 后端的团队。
本章摘要
Birdor 后端的职责是承载不能或不应在浏览器完成的能力:账户、API token、AI 调用、长任务、批处理、计费、用量统计和审计。基础工具尽量本地执行,后端服务高价值和自动化场景。
后端架构要从 MVP 起就区分同步 API 和异步任务。短任务用同步 API,长日志、批量文件和 AI 长分析使用任务队列。API 设计必须版本化、契约化,因为 API 一旦发布就难以修改。
33.1 后端服务边界
33.1.1 后端负责
| 能力 | 说明 | 优先级 |
|---|---|---|
| 用户登录/注册 | OAuth、邮箱、SSO | P0 |
| API token 管理 | 创建、撤销、权限范围 | P0 |
| Pro/Team 权限 | 订阅状态、功能解锁 | P0 |
| AI 调用 | 模型路由、prompt、成本记录 | P0 |
| 工具 API | JSON validate、JWT decode 等 | P1 |
| 用量统计 | 调用次数、token、成本 | P0 |
| 任务队列 | 异步处理长任务 | P1 |
| 结果存储 | 历史记录、报告、模板 | P1 |
| 账单事件 | Stripe webhook、发票 | P1 |
| 审计日志 | 安全事件、数据访问 | P2 |
33.1.2 后端不负责(前端/本地处理)
| 能力 | 原因 |
|---|---|
| JSON 格式化 | 可纯前端完成 |
| Base64 编解码 | 无安全风险,本地更快 |
| Timestamp 转换 | 确定性计算 |
| UUID 生成 | 无后端依赖 |
| 简单正则测试 | 本地执行 |
后端不应该承担所有基础工具计算。能本地完成的能力优先本地执行,同时抽象为可复用模块供 API 使用。
33.2 API 设计规范
33.2.1 版本化路径
POST /v1/json/format
POST /v1/json/validate
POST /v1/jwt/decode
POST /v1/regex/generate
POST /v1/log/analyze
GET /v1/usage
GET /v1/billing
版本号在路径中(非 header),便于缓存和调试。
33.2.2 统一响应格式
{
"request_id": "req_abc123",
"success": true,
"data": { ... },
"error": null,
"usage": {
"credits_consumed": 25,
"quota_remaining": 475,
"cost_usd": 0.0025
},
"warnings": ["input_truncated"],
"meta": {
"version": "v1",
"timestamp": "2025-08-08T10:00:00Z"
}
}
33.2.3 统一错误码
| 错误码 | HTTP | 说明 | 用户提示 |
|---|---|---|---|
invalid_input | 400 | 输入格式错误 | “输入格式不正确,请检查” |
quota_exceeded | 429 | 超出额度 | “额度已用完,请升级或等待重置” |
payload_too_large | 413 | 输入过大 | “内容超过限制,请分段提交” |
unauthorized | 401 | 认证失败 | “API token 无效或已过期” |
model_unavailable | 503 | 模型服务故障 | “AI 服务暂时不可用,请重试” |
rate_limited | 429 | 请求过快 | “请求过于频繁,请稍后再试” |
task_failed | 500 | 异步任务失败 | “处理失败,请查看任务状态” |
33.3 同步与异步任务设计
33.3.1 同步 API(< 5 秒)
| 工具 | 端点 | 超时 |
|---|---|---|
| JSON format | POST /v1/json/format | 10s |
| JSON validate | POST /v1/json/validate | 10s |
| JWT decode | POST /v1/jwt/decode | 5s |
| Base64 | POST /v1/base64/encode | 5s |
| AI Regex | POST /v1/regex/generate | 15s |
33.3.2 异步任务(> 5 秒)
| 工具 | 端点 | 典型耗时 |
|---|---|---|
| AI Log Analyzer | POST /v1/log/analyze | 10-60s |
| 批量处理 | POST /v1/batch/process | 30-300s |
| 大文件转换 | POST /v1/file/convert | 30-120s |
| 长文本 AI | POST /v1/ai/long-text | 15-60s |
33.3.3 异步任务状态机
[created] → [queued] → [processing] → [completed]
↓ ↓ ↓
[cancelled] [failed] [expired]
异步任务需要四类接口:
POST /v1/tasks # 创建任务
GET /v1/tasks/:id # 查询状态
GET /v1/tasks/:id/result # 获取结果
DELETE /v1/tasks/:id # 取消任务
33.4 任务队列设计
33.4.1 任务表结构
CREATE TABLE tasks (
id UUID PRIMARY KEY,
user_id UUID NOT NULL,
workspace_id UUID,
task_type VARCHAR(50) NOT NULL, -- 'log_analyze', 'batch_process'
status VARCHAR(20) NOT NULL, -- 'created', 'queued', 'processing', 'completed', 'failed', 'cancelled'
input_ref TEXT, -- 输入数据引用(S3/存储路径)
output_ref TEXT, -- 输出结果引用
error TEXT, -- 失败原因
priority INT DEFAULT 0, -- 优先级(Pro 用户更高)
retry_count INT DEFAULT 0,
max_retries INT DEFAULT 2,
created_at TIMESTAMP DEFAULT NOW(),
started_at TIMESTAMP,
finished_at TIMESTAMP,
expires_at TIMESTAMP -- 结果过期时间
);
33.4.2 队列优先级
| 优先级 | 用户 | 说明 |
|---|---|---|
| 高 | Pro+/Team | 付费用户优先 |
| 中 | Pro | 标准付费用户 |
| 低 | 免费/登录 | 免费用户排队 |
33.5 用量统计体系
所有 API 和 AI 调用都要记录用量:
{
"usage_record": {
"user_id": "usr_xxx",
"api_token_id": "tok_yyy",
"endpoint": "v1/log/analyze",
"task_type": "ai_log",
"model": "gpt-4o-mini",
"input_tokens": 2048,
"output_tokens": 1024,
"credits_consumed": 50,
"cost_usd": 0.005,
"latency_ms": 2340,
"success": true,
"error_code": null,
"timestamp": "2025-08-08T10:00:00Z"
}
}
这些数据服务 Pro、API 计费和成本控制。
33.6 数据存储设计
| 数据类型 | 存储 | 保留策略 | 加密 |
|---|---|---|---|
| 用户和账户 | PostgreSQL | 存续期 + 30 天 | 密码哈希 |
| API token | PostgreSQL | 与 token 生命周期一致 | 哈希存储 |
| 用量记录 | ClickHouse/TimescaleDB | 12 个月 | 无 |
| 任务结果 | S3/对象存储 | 30 天 | 服务端加密 |
| 审计日志 | 不可变日志 | 24 个月 | 签名验证 |
| 历史记录 | 用户选择开启 | 用户控制 | AES-256 |
历史记录应由用户明确开启或保存,不能默认保存敏感输入。
33.7 安全设计
| 层面 | 措施 |
|---|---|
| 认证 | API token + JWT session |
| 授权 | Scope 限制(read/write/admin) |
| 限流 | 按 token、按用户、按 IP 三层限流 |
| 输入校验 | 严格 schema 验证,防止注入 |
| 敏感数据 | 日志脱敏,不保存原始输入 |
| 传输 | TLS 1.3,HSTS |
33.8 开发落地清单
第一批后端任务:
- 用户和会话基础(OAuth + 邮箱)
- API token 创建、撤销、校验
- 统一错误响应格式
- JSON validate API 原型
- AI Regex 调用服务
- 用量记录表和查询接口
- 任务表和状态查询预留
不要第一天做完整 billing,但要记录足够用量数据,避免后续无法计费。
33.9 后端风险
| 风险 | 影响 | 预防 |
|---|---|---|
| API 无版本 | 无法兼容升级 | 路径版本化 |
| 错误码混乱 | 用户无法处理 | 统一错误码 |
| 任务队列过早复杂 | 维护困难 | MVP 简单实现 |
| 历史默认保存敏感输入 | 隐私事故 | 默认不保存 |
| AI 调用无法统计成本 | 无法计费 | 用量记录先行 |
33.10 验收标准
- API 有版本号(v1)。
- 所有错误返回统一结构。
- API token 可创建、可撤销、有 scope。
- 用量能按用户、按 token、按端点记录。
- 长任务有 task_id 和状态查询。
- AI 调用能记录 token 和成本。
- 敏感输入默认不保存。
- 有基础的 rate limit 和 quota 检查。
33.11 本章结论
Birdor 后端应服务高价值能力:账户、API、AI、任务、计费和观测。同步 API 和异步任务要从一开始分清,错误码和用量统计要统一。后端不需要第一天就完美,但必须有清晰的边界和可追踪性。
延伸阅读
FAQ
Q: 后端需要一开始就微服务化吗?
A: 不需要。MVP 阶段单体服务足够。当某个模块(如 AI 服务)成为瓶颈时,再考虑拆分。过早微服务会增加运维复杂度。
Q: 为什么历史记录默认不保存?
A: 开发者工具处理的数据可能包含敏感信息(JWT、日志、配置)。默认保存会带来隐私风险和法律合规问题。用户明确选择保存后,才存储数据。
Q: 异步任务用什么队列?
A: MVP 可用 Redis + Bull(Node.js)或 Celery(Python)。生产环境可迁移到 Kafka、RabbitMQ 或托管服务(AWS SQS)。重点是任务状态可追踪,不是队列有多高级。
Q: API 版本怎么演进?
A: v1 保持向后兼容。重大变更时发布 v2,v1 至少维护 12 个月。不要频繁发新版本,API 稳定性是开发者信任的基础。
Q: 用量统计和数据存储成本高吗?
A: ClickHouse 或 TimescaleDB 处理时序数据成本很低。用量记录是 Birdor 的"经营数据",值得投入。没有用量数据,后续计费、成本优化和用户体验都无从谈起。
33.21 数据库设计核心原则
Birdor 后端数据库设计遵循"少即是多"的极简原则,避免为假设的需求提前建表。
| 设计原则 | 核心含义 | Birdor 实践方式 |
|---|---|---|
| 少即是多 | 不为假设的需求建表 | 核心表仅 4 张:users、tokens、tasks、usage_records |
| 索引是查询的镜像 | 每个高频查询模式对应一个索引 | user_id + timestamp 复合索引覆盖 80% 查询 |
| 软删除优于硬删除 | 审计和事故恢复需要 | 所有业务表增加 deleted_at 字段 |
| 时间戳是生命线 | 可追溯性是的基础 | created_at、updated_at 由数据库自动注入 |
| 外键是数据约束 | 防止脏数据和孤立记录 | 核心关联表使用外键约束 |
表设计扩展策略:当单表数据量超过 1000 万行时,优先考虑按时间范围分区(Partitioning),而非立即分库分表。分区对查询透明,迁移成本低。
33.22 缓存策略
缓存不是性能问题的补丁,而是架构设计的组成部分。Birdor 采用三级缓存体系:
| 数据类型 | 缓存层 | 过期策略 | TTL | 失效触发 |
|---|---|---|---|---|
| 用户会话 | Redis | 主动失效 + 延期 | 24 小时 | 登出、密码修改、权限变更 |
| API 工具响应 | CDN Edge | 标签失效 | 1 小时 | 工具版本号变更 |
| 用量统计聚合 | 应用内存 | 定时刷新 | 5 分钟 | 定时任务 |
| AI 结果去重 | Redis | 输入 SHA256 hash 匹配 | 1 小时 | 模型版本升级 |
| 模板数据 | CDN | 版本号失效 | 24 小时 | 模板发布 |
缓存一致性的保证:写入数据库后同步删除缓存(Cache-Aside 模式),不采用 Write-Through 以避免写入延迟。AI 结果缓存需特别注意:不同模型版本须使用不同缓存 key 前缀,防止旧模型结果被错误复用。
33.23 容量测试策略
Birdor 后端容量测试不是一次性活动,而是持续验证系统边界的工程实践:
| 测试类型 | 测试目标 | 执行频率 | 推荐工具 | 通过标准 |
|---|---|---|---|---|
| 负载测试 | 确定系统最大稳定容量 | 重大发布前 | k6 / Locust | p95 延迟增长 < 50% |
| 压力测试 | 测试系统在极限下的优雅降级 | 每季度 | k6 | 错误率 < 0.5%,无级联崩溃 |
| 耐久测试 | 长时间运行下的稳定性与内存泄漏 | 每半年 | 自建脚本 | 24h 后内存增长 < 10% |
| 尖峰测试 | 流量突增时的自动扩容响应 | 每季度 | k6 | 扩容触发 < 60 秒,错误率 < 1% |
容量测试的准生产环境:使用与生产相同配置但规模减半的 Staging 集群,配合流量镜像(Traffic Mirroring)技术复现真实负载分布。
33.24 服务间通信模式
MVP 阶段 Birdor 采用单体架构,但随着模块复杂度增加,服务间通信模式需提前规划:
| 通信模式 | 适用场景 | 优点 | 缺点 | Birdor 采用策略 |
|---|---|---|---|---|
| 同步 HTTP REST | 工具 API 调用、用户请求 | 简单、可追踪、调试友好 | 阻塞调用、服务间耦合 | 当前主要模式 |
| 异步消息队列 | 用量统计、事件通知、审计日志 | 解耦、可重试、削峰 | 最终一致性,复杂度上升 | 已采用(Redis Pub/Sub) |
| gRPC | 内部高性能服务通信 | 高性能、强类型契约 | 浏览器支持差,学习成本高 | 暂不采用 |
| GraphQL | 复杂多端查询聚合 | 精确获取、减少往返 | 缓存复杂、学习曲线陡峭 | 暂不采用,REST + BFF 足够 |
演进触发条件:当 AI Gateway 的调用量超过 API 总流量的 50% 时,将 AI 服务从单体中拆分为独立服务,通信模式保持 HTTP REST(内部)+ 异步事件(用量统计)。
33.25 数据一致性策略
不同业务场景对一致性的要求不同,Birdor 按场景选择适配策略:
| 业务场景 | 一致性要求 | 策略选择 | 实现方式 |
|---|---|---|---|
| 账户余额与配额 | 强一致性 | 数据库事务 | PostgreSQL ACID + 乐观锁 |
| 用量统计记录 | 最终一致 | 异步写入 + 定时对账 | 消息队列 + 批处理聚合 |
| 异步任务状态 | 强一致性 | 状态机 + 乐观锁 | 数据库行级锁 + 状态校验 |
| 缓存数据 | 最终一致 | 失效 + 刷新 | TTL 过期 + 主动失效消息 |
| 计费事件 | 强一致性 | 事务 + 幂等校验 | Stripe Webhook 幂等处理 |
一致性设计的底线原则:涉及资金(余额、配额、计费)必须强一致;涉及统计和日志可以最终一致。不要为了统一而统一,正确性优先于简洁性。
33.26 数据库扩展策略
Birdor 的核心数据表设计预留了水平扩展空间,但扩展应遵循"需要时才做"的原则。
| 扩展场景 | 触发条件 | 策略 | 操作窗口 |
|---|---|---|---|
| 单表数据量 > 1000 万 | 查询延迟 p95 > 200ms | 按时间范围分区(Partitioning) | 低峰期 |
| 写流量 > 5000 QPS | 主库 CPU > 80% | 读写分离 + 一主多从 | 计划维护窗口 |
| 用户地域分散 | 某区域延迟 > 300ms | 区域只读副本 | 逐步迁移 |
| 多租户隔离需求 | Enterprise 客户数量 > 10 | 逻辑隔离 → 物理隔离 | 新实例 |
分区策略示例:usage_records 表按月分区,查询最近 30 天数据时只需扫描 1-2 个分区,避免全表扫描。
33.27 缓存失效的精细化控制
缓存失效不当会导致数据不一致或缓存击穿。Birdor 的缓存失效策略:
| 数据类型 | 正常失效 | 紧急失效 | 预热策略 |
|---|---|---|---|
| 用户会话 | TTL 24h 自然过期 | 密码修改时主动删除 | 登录后自动写入 |
| API 响应 | 版本号变更时标签失效 | 严重 bug 修复时 CDN purge | 发布前预渲染热点工具页 |
| AI 结果缓存 | 模型版本升级时 hash 前缀变更 | 模型输出质量问题时全局清空 | 无,按需生成 |
| 模板数据 | 模板发布后版本号失效 | 紧急安全更新时全局失效 | 启动时加载到内存 |
缓存击穿的防护:对高并发查询的 key 使用互斥锁(Mutex),只允许一个请求穿透到数据库,其余请求等待缓存回填。
33.28 容量测试的自动化
容量测试应集成到 CI/CD 流水线中,成为每次重大发布的前置条件。
# .github/workflows/capacity-test.yml 示例
capacity-test:
runs-on: ubuntu-latest
steps:
- name: Run k6 load test
run: k6 run --vus 100 --duration 10m load-test.js
- name: Check p95 latency
run: |
p95=$(cat results.json | jq '.metrics.http_req_duration.p95')
if [ $(echo "$p95 > 200" | bc) -eq 1 ]; then
echo "p95 latency $p95 exceeds budget"; exit 1
fi
- name: Check error rate
run: |
error_rate=$(cat results.json | jq '.metrics.http_req_failed.rate')
if [ $(echo "$error_rate > 0.005" | bc) -eq 1 ]; then
echo "Error rate $error_rate exceeds 0.5%"; exit 1
fi
自动化容量测试的输出不仅是通过/失败,还包括详细的资源瓶颈分析报告,指导下一次扩容决策。
33.29 任务队列的监控与告警
任务队列是后端稳定性关键,必须有完善的监控体系。
| 监控指标 | 告警阈值 | 告警级别 | 响应动作 |
|---|---|---|---|
| 队列深度 | > 100 | P2 | 检查消费者健康状态 |
| 队列深度 | > 500 | P1 | 启动备用消费者 |
| 任务处理延迟 | > 5 分钟 | P2 | 检查下游服务 |
| 任务处理延迟 | > 15 分钟 | P1 | 执行降级策略 |
| 任务失败率 | > 1% | P2 | 检查错误日志 |
| 任务失败率 | > 5% | P1 | 暂停任务提交,排查根因 |
| 消费者进程存活 | 任一消费者 offline > 30 秒 | P0 | 自动重启 + 通知值班 |
队列监控的可视化:Grafana 面板展示队列深度趋势、各消费者处理速率和任务类型分布。队列深度的突然下降(非消费导致)可能是数据丢失信号,必须立即排查。
33.30 数据备份与恢复策略
Birdor 的数据是核心资产,备份策略必须与业务重要性匹配。
| 数据类型 | 备份频率 | 保留期 | 恢复时间目标 |
|---|---|---|---|
| 用户账户数据 | 每日全量 + 实时增量 | 90 天 | < 1 小时 |
| 用量统计 | 每周快照 | 12 个月 | < 4 小时 |
| 任务结果 | 对象存储版本控制 | 30 天 | < 30 分钟 |
| 审计日志 | 实时append-only备份 | 24 个月 | < 2 小时 |
| 配置数据 | 每次变更自动备份 | 无限(Git版本控制) | < 10 分钟 |
备份验证:每季度执行一次恢复演练,验证备份的完整性和恢复流程的可操作性。恢复演练的结果记录到灾难恢复手册中。
33.31 数据库连接池管理
连接池是数据库访问的关键资源,配置不当会导致性能瓶颈。
| 参数 | MVP 配置 | 增长期配置 | 说明 |
|---|---|---|---|
| 最小连接数 | 2 | 5 | 保持热连接,减少创建开销 |
| 最大连接数 | 10 | 20 | 根据实例规格和并发需求调整 |
| 连接超时 | 30 秒 | 30 秒 | 避免僵尸连接 |
| 空闲超时 | 10 分钟 | 10 分钟 | 回收闲置连接 |
| 获取超时 | 5 秒 | 5 秒 | 快速失败,避免级联阻塞 |
连接池监控:记录连接使用率、等待获取连接的时间和连接泄漏数量。连接使用率持续 > 80% 时应考虑扩容或优化查询。
33.32 后端性能监控
后端性能监控覆盖黄金指标和自定义业务指标。
| 监控维度 | 具体指标 | 告警阈值 | 监控工具 |
|---|---|---|---|
| API 延迟 | p50/p95/p99 响应时间 | p95 > 200ms | Prometheus + Grafana |
| 错误率 | 5xx 错误比例 | > 0.1% | Prometheus |
| 吞吐量 | QPS / RPS | 趋势监控 | Prometheus |
| 资源使用 | CPU / 内存 / 磁盘 | > 80% | Prometheus |
| 数据库 | 查询延迟、连接池使用率 | 查询 > 100ms | PostgreSQL 监控 |
| 缓存 | 命中率、驱逐率 | 命中率 < 80% | Redis 监控 |
| AI 调用 | 成功率、延迟、成本 | 成功率 < 95% | 自定义埋点 |
33.33 后端开发的编码规范
编码规范是质量的基础保障。
| 规范领域 | 要求 | 检查方式 |
|---|---|---|
| 错误处理 | 所有函数必须处理错误路径 | linter + code review |
| 日志规范 | 所有请求必须有 trace_id | 结构化日志校验 |
| 输入校验 | 所有外部输入严格 schema 校验 | 自动化测试 |
| 测试覆盖 | 核心业务逻辑 > 80% | CI 覆盖率检查 |
| 文档同步 | API 变更同步更新 OpenAPI 文档 | PR 模板检查 |
33.34 API 文档自动生成
API 文档应与代码同步维护,避免文档与实现脱节。
| 目标 | 实现方式 | 检查点 |
|---|---|---|
| 文档与代码一致 | OpenAPI 注释自动生成 | PR 中 diff 检查 |
| 示例可运行 | 文档中的示例代码在 CI 中执行 | 示例测试 job |
| 变更可追溯 | 文档变更关联到代码变更 | Git blame |
| 多版本共存 | /v1 /v2 路径独立文档 | 版本导航 |
自动生成的文档是后端开发者的契约承诺,也是前端和外部开发者集成的信任基础。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。