全栈后端阶段总结:把请求变成可恢复的状态变化
核验日期:2026-07-16。阶段范围:Node/Fastify-NestJS、Python/FastAPI、Go/chi、Java/Spring Boot、Rust/axum,以及统一契约、数据、可靠性与选型。
后端部分使用这条请求链作为共同坐标:connection → route → parse/validate → authenticate/authorize → use case/transaction → database/cache/message/upstream → commit/rollback → response/telemetry → shutdown/retry。语言与框架会改变每段的表达和成本,底层的分布式系统约束仍然存在。
把请求变成可信状态
HTTP bytes 进入服务后,先经过路由、解析和 Schema 验证,再结合当前身份、tenant、资源和动作完成授权。OpenAPI、黑盒契约测试、拒绝样例和稳定 problem 响应,用来证明协议在不同框架中保持一致。
真正的数据变化发生在用例和事务中。数据库约束、隔离级别与并发测试说明哪些操作必须原子完成;幂等记录、outbox/inbox、attempt 和 deadline 说明请求或消息重复后为何不会重复副作用。缓存只能复用读取结果,key、范围、版本、TTL、失效和陈旧窗口都要有明确拥有者。
并发模型最终受 CPU、连接池、队列、锁和下游容量约束。取消、profile、pool wait 与 p99 能把“服务慢”拆成具体等待位置。预期业务失败、依赖失败和程序 bug 也要分别映射,不能全部变成同一种 500。
部署前还要验证配置、readiness、数据库迁移、滚动发布、drain 和回滚。SLO 所需的 CPU、内存、连接和维护人力来自原始负载与事故记录,不来自语言的单项跑分。
统一生命周期
读取服务不需要这条完整写路径,但文章必须讲清它,因为下一阶段的工具执行和Agent任务会产生副作用。响应成功前业务状态与outbox同事务;消费者至少一次并去重;外部服务不放长事务。客户端超时不知道写是否完成,只能用key/query result恢复。
五种实现的稳定差异
Node以schema、event loop和npm生态作为主要讲解版本;Python以Pydantic、ASGI/async与AI数据生态见长;Go以标准库、goroutine/context、显式error和部署简洁见长;Java以ApplicationContext、声明事务、Security、JVM诊断和企业组件见长;Rust以ownership、Result、Send/Sync、Tokio和低层控制把错误前移。
不存在“静态类型即不需要验证”:TS annotation、Python hint、Go/Java/Rust type都无法直接信任HTTP bytes。不存在“协程即无限并发”:Node/Python/Rust executor、Go goroutine、Java virtual thread最终争用CPU、DB pool和下游。不存在“ORM即一致性”:constraint、transaction、isolation、idempotency共同保证。
统一 API 交付
五个服务应对同一contract suite:health/ready;列表/详情;query/category/limit/cursor;unknown/missing/null/encoding;404/405/400;content type/request id/data version;fixture损坏503;client cancel;并发;shutdown。框架默认响应全部映射项目problem。
fixture启动加载并验证,生成immutable snapshot和version;更新用原子版本,不在每请求磁盘解析。分页cursor编码稳定排序键/版本并签名或验证,不能直接信任客户端offset对象。列表响应顺序固定,跨语言Unicode casefold/locale差异需选择明确规则或fixture。
数据交接包
Agent 阶段需要继续使用这些数据事实:schema/字段含义、主键/tenant、数据版本、PII/secret 分类、retention、读取/写入 owner、一致性、索引、migration、备份恢复、fixture 与生成方式。Agent 检索内容不能绕过数据授权;embedding/vector 派生数据也要记录 source version 和删除传播。
工具/API交接包
每个可调用操作记录 method/path/schema、认证、authorization action、幂等性、deadline、rate/cost、side effect、错误码、重试、审计和人工确认。Agent不能从OpenAPI猜哪些操作安全重试。只读工具与写工具分开credential/scope;高风险操作preview/confirm。
任务交接包
长工作不由HTTP background callback承载。任务记录id、type、input version、principal/tenant、attempt、status、lease、deadline、result/error、cost/trace、idempotency。worker claim有lease/heartbeat;崩溃可重试;外部副作用按step idempotency;取消是状态且协作传播。
这正是Agent工具/模型调用需要的durable orchestration基础。进程内Promise、FastAPI BackgroundTasks、goroutine、@Async、Tokio spawn都只能做可丢失工作。
权限与信任边界交接
入口身份与 tenant、服务账号、数据库角色、cache/broker namespace、outbound host、secret、管理员端点、调试/profile、供应链和部署权限都要明确。Agent 阶段会增加提示注入、工具参数和模型供应商;在此之前,先保证工具执行始终经过相同的验证、授权、幂等和审计,模型文本没有特殊权限。
可观测性交接
统一request/trace/task id,记录code/data/model/tool version;日志脱敏,metrics低基数,trace采样保留错误/高延迟,profile有受控入口。SLO至少定义availability、latency、correctness/duplicate、freshness和task completion。Agent阶段再增加token、model latency、tool success、quality evaluation和cost。
故障演练
- 非法JSON/超大body/未知字段,确认在业务前拒绝。
- 错tenant/过期token/权限变化,确认无数据泄露。
- DB pool耗尽、deadlock、serialization failure,确认deadline/retry/503。
- cache不可用/击穿/陈旧,确认源站保护和版本。
- 上游慢/断开/返回部分数据,确认取消与错误映射。
- 同idempotency key并发,确认单一结果;不同payload同key冲突。
- outbox publish失败/consumer崩溃,确认重试不重复副作用。
- SIGTERM在途请求/任务,确认drain或重新入队。
- migration期间新旧版本并存,确认读写兼容与回滚。
- CPU/内存/日志过载,确认bulkhead、拒绝和诊断。
性能与容量验收
正确性/故障全过后,同机器/数据库/契约测五种实现。报告cold/ready、warm、p50/p95/p99、errors、CPU、RSS/heap、GC、connections/pool wait、queue、response bytes、日志/trace、镜像/build和成本。开发交付时间、CI、升级、on-call同样记录。
Little's Law直觉:到达率乘系统时间形成在途量。下游变慢会让连接/内存堆积;任何语言都必须有限queue和overload response。容量计划从瓶颈出发,不靠增加goroutine/virtual thread/task/worker掩盖DB限制。
事故排查总图
进入 Agent Developer 的条件
能定义并实现稳定API;能区分验证/授权/事务/constraint;能把关键后台工作持久化;能解释并发与资源;能设计幂等/outbox/inbox;能提供工具权限和审计;能从trace定位故障;能以SLO/成本选语言并回滚。未满足时,Agent只会把不可靠后端放大。
贯穿项目验收脚本的语义
统一黑盒测试不能只发送happy path。启动每个实现后先轮询ready并记录版本;固定fixture hash/dataVersion。测试query缺失/空/空白/Unicode/超长、category unknown、limit边界/重复参数、cursor损坏/旧版本、encoded slash、method与content negotiation。响应检查status、headers、完整JSON、字段顺序不作为契约、数组顺序作为业务规则。
错误测试检查problem type/title/status/code/requestId/details,不比较框架内部message。发送无效UTF-8/JSON、超header/body、断开客户端;服务不能崩溃或泄露stack/path。并发运行相同读取,输出稳定;在fixture reload期间只能看到旧或新完整版本,不能部分。
性能runner必须在contract全过后启动,保存server stdout/stderr、版本、容器limits和原始samples。若实现默认日志/validation不同,先统一用户可见功能但保留真实生产telemetry,不通过关掉安全换性能。报告不能自动产生“赢家”,只提供决策输入。
从只读到写入的演练
为POST /technologies设计而不一定立即实现:command schema、principal/permission、idempotency-key、request hash、unique id/name、transaction、outbox、201/409、Location/ETag、重复返回。画出客户端超时、DB commit成功但响应丢失、publisher失败、consumer重复。若设计依赖“请求只执行一次”,返回重做。
再设计PATCH:If-Match/version、missing/null、字段权限、状态迁移、validation、optimistic conflict。批量写定义全成功事务还是逐项结果;不要让框架自动binding决定。Delete定义soft/hard、引用、retention、event和cache invalidation。每个决定进入Agent工具描述,避免模型猜。
评审问答
评审者随机抽一条规则追到证据:输入最大长度在哪里限制和测试;tenant授权是否进入query;unique并发由什么constraint;transaction是否含HTTP;retry是否幂等且受deadline;cache key是否含tenant/version;后台任务是否持久;SIGTERM如何处理在途;migration为何可滚动;profile如何取得且不公网暴露。
再抽一种语言解释其特有失败:Node同步CPU、Python async内阻塞、Go goroutine泄漏、Java代理self-invocation/virtual thread压pool、Rust lock跨await/detached task。答案必须包含表现、根因、观测和修正,不能只是最佳实践口号。
最后要求写选择记录:当前团队/期限、必须生态、SLO/资源、数据/合规、候选淘汰、spike原始结果、选择/不选、风险/owner、回滚、复审日期。无法写明“不选”的原因通常表示比较仍停留在偏好。
复审触发器
用户从读变写、高价值副作用、多租户、数据地域、实时/离线、流量级别、SLO、数据库/消息、语言/框架major、团队/招聘、平台成本、Agent工具范围变化时重读 comparison.md。复审验证条件,不为追新重写。
阶段来源
语言/框架版本与机制见五篇文章。协议遵循RFC 9110/9457;数据库事务/隔离以目标数据库官方文档;telemetry以OpenTelemetry规范;安全以具体identity/OWASP/平台文档。所有性能与成本结论使用项目原始数据。