Agent Developer Roadmap
全栈后端

全栈后端:从 HTTP 请求到一致性与恢复

核验日期:2026-07-16。版本观察窗口为 Node.js 24 LTS、Fastify 5、NestJS 11,Python 3.14、FastAPI 0.138,Go 1.26、chi 5.3,Spring Boot 4.1、Java 17–26,以及 Rust 2024 Edition、axum 0.8、Tokio 1.x。依赖与支持策略会变化,生产决策必须重新核对各文末官方来源。

把前端函数换成 HTTP handler 还不足以构成可靠后端。一个请求会穿过代理、路由、解析、验证、认证、授权、事务、缓存、外部服务、序列化和日志;每一步都可能超时、取消、重复或部分成功。这里用五种语言实现同一读取契约,重点比较语言和生态怎样表达边界,不为某种语言预设全面领先的结论。

在学习路线中的位置

Web 基础定义 URL、HTTP、缓存、存储和浏览器失败;前端框架安排 server/client、状态和渲染;构建工具交付产物;运行时解释模块、事件循环、权限与生命周期。后端接过这些事实,把请求变为可信输入,把业务状态放进正确的一致性边界,并让超时、重试、关闭和事故可观察。Agent 阶段会把模型调用、检索和工具执行建立在这里的 API、任务、权限、评测数据与可恢复工作流之上。

调试沿这条链找第一个错误中间状态。400/422 先看解析与验证;401 与 403 分开看身份和权限;重复写入看幂等与事务;延迟长尾区分队列、连接池、锁、外部依赖和运行时阻塞;进程重启后任务丢失看是否在响应前持久化。不要看到 500 就换 ORM 或把 timeout 全部调大。

目标读者与完成条件

读者已经理解 HTTP、JSON、异步 I/O 和 JavaScript 运行时。完成这一阶段后应能:

  • 用稳定契约定义路径、查询、正文、状态、headers、错误和版本,而不是让框架默认值成为协议。
  • 区分语法类型、运行时验证、数据库约束与业务不变量;解释每一层漏掉时的失败。
  • 设计 deadline、取消、重试、幂等、事务和 outbox,使部分失败可以恢复。
  • 分清 cache-aside、HTTP cache、进程内缓存和权威数据库,定义 key、范围、TTL、失效和陈旧窗口。
  • 在 Node/TypeScript、Python、Go、Java、Rust 中实现同一 API,理解事件循环、协程/goroutine、虚拟线程和 Future 的差异。
  • 按团队、生态、交付周期、尾延迟、资源、诊断和维护选择语言,而非按 Hello World 吞吐排名。
  • 留下可以交给 Agent 阶段的 API、数据、任务、权限、可观测性和成本证据卡。

学习主线

请求先经过协议边界。路径、查询、正文、header 和身份信息都来自外部,需要限制大小、解析并验证;缺失、空值、未知字段、分页和错误格式要在 OpenAPI 与契约测试中固定下来。认证回答“是谁”,授权还要结合 tenant、资源和动作判断“能做什么”。

进入用例后,重点转向状态变化。数据库约束守住最后一道数据边界,事务只包需要原子完成的工作;重复请求用幂等键识别,提交后的事件通过 outbox 与业务状态一起落库,消费者再用 inbox 或去重处理至少一次投递。缓存有自己的 key、范围、TTL 和失效者,不能成为另一份无人负责的数据源。

并发模型决定工作怎样等待和取消,却不能突破数据库连接、上游容量和 CPU 限制。Node 的事件循环、Python 的协程、Go 的 goroutine、Java 的虚拟线程与 Rust Future 各有不同开销和阻塞边界。比较它们时要观察队列、连接池、锁、取消传播、p95/p99、CPU、内存和错误率,不能只数“线程”或“任务”。

一个后端还要能启动、观测和退出。配置在接流量前验证,secret 不进入镜像和日志;request/trace id 把日志、指标、trace 与 profile 关联;readiness、drain、数据库迁移、灰度与回滚都要有演练记录。测试从纯函数和 handler 逐步进入真实数据库、契约、并发、迁移与少量端到端路径。

这一部分不重复浏览器渲染,也不讨论模型质量。错误结构、恢复动作和稳定字段仍会影响前端可访问体验;下一部分的 Agent 则直接复用这里交付的 API、任务、权限和可观测性能力。

文章与阅读顺序

文件核心问题主要迁移心智
nodejs-backend.md如何在熟悉的 TypeScript/Node 参照上建立 Fastify schema-first 与 NestJS 组织边界从 handler 堆叠转向契约、插件封装、依赖生命周期
python-fastapi.mdPython 动态运行时、类型提示、Pydantic 与 ASGI 怎样组合类型提示不等于运行时对象;async 与 blocking 库必须分开
go-chi.mdnet/http、chi、goroutine、context 和显式错误怎样构成小服务组合接口、值/指针、显式资源与取消
java-spring-boot.mdJVM、Spring 容器、MVC/WebFlux、虚拟线程和企业组件如何取舍启动期装配、声明式事务、线程/上下文与运行时治理
rust-axum.md所有权、Result、trait、Tokio Future 和 axum extractor 怎样把错误前移编译期约束、显式共享、blocking/async 边界
comparison.md如何在同契约、同数据、同负载下比较语言与生态硬约束淘汰、证据评分、可回滚迁移
summary.md如何把后端能力交接给 Agent DeveloperAPI/数据/任务/权限/观测/成本记录

建议前端开发者从 Node 参照开始,再读 Python 与 Go:前者展示动态语言和 AI 生态衔接,后者展示标准库、静态编译和 goroutine。Java 展示容器、成熟企业生态和虚拟线程,Rust 展示所有权与显式错误。最后用比较页做当前项目决策,不需要为了“全栈”在生产同时维护五种语言。

贯穿项目:同契约技术目录 API

五个实现读取同一固定 JSON fixture,不提前引入数据库写入、用户系统或付费服务。共享契约:

  • GET /health 仅表示进程/实例存活;GET /ready 在数据和必要依赖可服务后成功。
  • GET /technologies 支持 querycategorylimitcursor;定义缺失、空字符串、大小写、最大长度和未知参数策略。
  • GET /technologies/{id} 返回单项;不存在返回统一 404 problem document。
  • 非 GET 返回 405Allow;不合法输入返回统一 400,不让框架的 400/422 差异泄露成五套协议。
  • 每个响应带 x-request-id;错误响应只含稳定 code、用户可读 messagerequestId 和允许的 details
  • JSON 数据加载/校验失败时 readiness 失败或返回 503,日志保留内部 cause,响应不暴露路径、堆栈和 secret。

领域核心不依赖 Fastify、FastAPI、chi、Spring 或 axum 的 Request 对象。HTTP adapter 负责协议,service 负责用例和业务不变量,repository 负责数据来源。小示例可以同文件,但边界必须在函数签名中清楚;不要为了目录整齐制造一层只转发参数的“架构”。

统一错误模型

{
  "type": "https://example.invalid/problems/invalid-query",
  "title": "请求参数不合法",
  "status": 400,
  "code": "INVALID_QUERY",
  "requestId": "req_123",
  "details": [{ "field": "limit", "reason": "必须介于 1 和 100" }]
}

type/title/status 借鉴 Problem Details;code 供客户端稳定分支,requestId 用于支持。验证错误不回显 secret 或完整 body。401 表示没有有效身份,并按协议提供 challenge;403 表示身份存在但权限不足;404 可用于避免泄露资源存在;409 表示状态冲突;429 表示限流;503 表示当前无法服务且可结合 Retry-After。不要把所有业务失败返回 200,也不要把数据库异常文本直接变成 500 body。

统一数据与并发原则

虽然读取示例使用 JSON,每篇都必须讲清数据库、缓存和消息,因为语言选择最终服务真实状态。跨语言不变量:数据库约束是最后防线;事务只包必要原子工作;外部 HTTP 不放进长数据库事务;retry 只对已知瞬时错误并有次数、退避、抖动和 deadline;写操作使用幂等 key;事件通过 transactional outbox 与业务提交绑定;消费端用 inbox/去重应对至少一次投递。

缓存不是第二数据库。key 包含 tenant、身份范围、查询、数据版本;TTL 与失效策略有拥有者;缓存失败可降级到源;防击穿要有有界 single-flight/锁;陈旧读取有明确窗口。五种语言都应先保证不使用 cache 时正确,再添加缓存。

统一性能与成本实验

正确性全部通过后再比较:固定 API、数据、响应、机器/容器 CPU 与内存、数据库/网络、连接复用、并发、日志与 telemetry、预热和采样时间。记录语言/框架/编译器精确版本、启动、镜像、RSS/heap、CPU、吞吐、p50/p95/p99、错误、GC、连接池等待和成本。

不要把 Node event loop、Python async、Go goroutine、Java virtual thread、Rust task 的数量直接比较;它们的栈、调度、阻塞边界和生态驱动不同。用同一用户负载看最终 SLO 与运维证据。厂商 benchmark 只帮助设计复现实验。

统一安全边界

入口限制 method、URL/header/body 大小、content type 与解析深度;输入使用参数化 SQL;出站网络防 SSRF;文件/命令使用 allowlist;认证 token 校验 issuer/audience/expiry/key rotation;授权在资源与 tenant 上执行;日志脱敏;secret 不进源码、镜像和错误;依赖锁定并跟踪安全更新。框架 middleware 只能实现策略,不能替代威胁建模。

统一测试金字塔

纯函数单测覆盖过滤、cursor、错误映射;handler/component test 在内存中发真实 HTTP 请求;contract test 对五种实现跑同一黑盒用例;数据库集成使用真实目标数据库的隔离实例,不用 SQLite 假装 PostgreSQL;并发 test 证明 idempotency/constraint;migration test 验证旧数据升级和回滚/前向修复;少量 E2E 穿过代理与部署。

故障证据卡

保存 method/URL/request/trace id、身份/tenant(脱敏)、服务/代码/数据/schema 版本、runtime/framework、pod/region、deadline、重试次数、路由、验证结果、数据库 query/transaction/lock/connection wait、cache hit/version、外部请求、响应状态/字节、CPU/内存/GC 与恢复步骤。事故时沿请求链找第一个错误状态,不先重启全部实例或清空所有 cache。

共同数据库实验

即使贯穿实现以JSON fixture为主,学习验收仍要用同一PostgreSQL(或团队目标数据库)做小型实验。表包含id/tenant_id/name/category/version/created_at/updated_at,unique覆盖tenant+name,check限制category,version做optimistic并发;idempotency与outbox另表。五种语言使用同DDL/migration与固定fixture,不让ORM自动建表产生五套差异。

实验一是连接池:固定数据库最大连接和应用副本,逐步增加并发,记录acquire wait、active、query、p99。证明应用并发模型不能突破DB容量。实验二是两个并发命令写同unique key,预期一个成功一个稳定409,不出现两条。实验三是两个版本更新同记录,后提交者获得version conflict。实验四是commit后响应丢失,使用相同idempotency key取得原结果。

实验五是outbox:事务提交业务和事件,publisher第一次失败、第二次成功;consumer重复收到只执行一次。实验六是migration:旧代码运行时先加兼容字段,新代码滚动,回填,再收constraint;随后演练代码回滚。任何语言若需要不同数据库语义才能通过,就必须在比较中说明,而不是修改共享契约。

共同上游与超时实验

使用确定性fake upstream提供正常、慢header、慢body、500、429、断连和格式错误。每个实现设置相同总deadline与最大重试,记录attempt和剩余预算。客户端断开后能取消的上游取消;不能取消的工作受并发上限。429只在Retry-After和总deadline允许时重试;非幂等写没有key不自动重试。

Timeout不是单值:入口proxy、server读header/body、handler总预算、DB acquire/query、HTTP connect/header/body、queue lease、shutdown各有owner。画出从外到内的预算,外层通常留清理余量。若多个库各自默认重试,乘法风暴要禁用一层并统一策略。

共同发布演练

每种实现构建不可变artifact,记录语言/runtime/framework/依赖/commit/schema。部署canary,readiness在初始化完成后成功;旧实例先摘流量再drain。发布期间跑contract与代表请求,对比error/p99/resource。回滚旧artifact时验证新数据/schema/event仍兼容。

故障注入包括进程强杀、节点终止、数据库failover、cache/broker不可用、secret rotation和证书过期预演。恢复目标不仅“进程起来”,还包括无重复副作用、任务可重放、数据版本可解释和用户获得稳定错误。把结果放证据卡,成为语言选型中可靠性/运维成本依据。

官方资料入口

返回在线文档首页

在 GitHub 上编辑此页

本页目录