Birdor 商业计划书第三十三章:后端 API 与任务架构

设计 Birdor 的后端 API 与异步任务架构,覆盖工具 API、账户系统、API token、用量统计、批处理、长任务队列、错误码规范和服务边界。

本系列导航

本章关键词

后端 API、任务队列、API token、用量统计、批处理、错误码、异步任务、服务边界、版本化 API。

适合阅读的人

  • 正在设计 Birdor 后端架构的工程师。
  • 需要规划 API 版本、认证、限流和计费系统的人。
  • 想把工具站从纯前端扩展到 SaaS 后端的团队。

本章摘要

Birdor 后端的职责是承载不能或不应在浏览器完成的能力:账户、API token、AI 调用、长任务、批处理、计费、用量统计和审计。基础工具尽量本地执行,后端服务高价值和自动化场景。

后端架构要从 MVP 起就区分同步 API 和异步任务。短任务用同步 API,长日志、批量文件和 AI 长分析使用任务队列。API 设计必须版本化、契约化,因为 API 一旦发布就难以修改。

33.1 后端服务边界

33.1.1 后端负责

能力说明优先级
用户登录/注册OAuth、邮箱、SSOP0
API token 管理创建、撤销、权限范围P0
Pro/Team 权限订阅状态、功能解锁P0
AI 调用模型路由、prompt、成本记录P0
工具 APIJSON 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_input400输入格式错误“输入格式不正确,请检查”
quota_exceeded429超出额度“额度已用完,请升级或等待重置”
payload_too_large413输入过大“内容超过限制,请分段提交”
unauthorized401认证失败“API token 无效或已过期”
model_unavailable503模型服务故障“AI 服务暂时不可用,请重试”
rate_limited429请求过快“请求过于频繁,请稍后再试”
task_failed500异步任务失败“处理失败,请查看任务状态”

33.3 同步与异步任务设计

33.3.1 同步 API(< 5 秒)

工具端点超时
JSON formatPOST /v1/json/format10s
JSON validatePOST /v1/json/validate10s
JWT decodePOST /v1/jwt/decode5s
Base64POST /v1/base64/encode5s
AI RegexPOST /v1/regex/generate15s

33.3.2 异步任务(> 5 秒)

工具端点典型耗时
AI Log AnalyzerPOST /v1/log/analyze10-60s
批量处理POST /v1/batch/process30-300s
大文件转换POST /v1/file/convert30-120s
长文本 AIPOST /v1/ai/long-text15-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 tokenPostgreSQL与 token 生命周期一致哈希存储
用量记录ClickHouse/TimescaleDB12 个月
任务结果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 / Locustp95 延迟增长 < 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 任务队列的监控与告警

任务队列是后端稳定性关键,必须有完善的监控体系。

监控指标告警阈值告警级别响应动作
队列深度> 100P2检查消费者健康状态
队列深度> 500P1启动备用消费者
任务处理延迟> 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 配置增长期配置说明
最小连接数25保持热连接,减少创建开销
最大连接数1020根据实例规格和并发需求调整
连接超时30 秒30 秒避免僵尸连接
空闲超时10 分钟10 分钟回收闲置连接
获取超时5 秒5 秒快速失败,避免级联阻塞

连接池监控:记录连接使用率、等待获取连接的时间和连接泄漏数量。连接使用率持续 > 80% 时应考虑扩容或优化查询。

33.32 后端性能监控

后端性能监控覆盖黄金指标和自定义业务指标。

监控维度具体指标告警阈值监控工具
API 延迟p50/p95/p99 响应时间p95 > 200msPrometheus + Grafana
错误率5xx 错误比例> 0.1%Prometheus
吞吐量QPS / RPS趋势监控Prometheus
资源使用CPU / 内存 / 磁盘> 80%Prometheus
数据库查询延迟、连接池使用率查询 > 100msPostgreSQL 监控
缓存命中率、驱逐率命中率 < 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 路径独立文档版本导航

自动生成的文档是后端开发者的契约承诺,也是前端和外部开发者集成的信任基础。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「saas」更多文章

  1. 短链接对 SEO 的影响与优化最佳实践
  2. UTM 参数 + 短链接:追踪每一条营销链路
  3. 私域流量运营中的短链接策略:从引流到转化