名称: software-backend 描述: 跨Node.js (Express/Fastify/NestJS/Hono)、Bun、Python (FastAPI)、Go和Rust (Axum)的生产级后端服务开发,使用PostgreSQL和常见ORM (Prisma/Drizzle/SQLAlchemy/GORM/SeaORM)。用于REST/GraphQL/tRPC API、身份验证 (OIDC/OAuth)、缓存、后台任务、可观测性 (OpenTelemetry)、测试、部署就绪和零信任默认。
软件后端工程
使用此技能设计、实现和审查生产级后端服务:API边界、数据层、身份验证、缓存、可观测性、错误处理、测试和部署。
默认偏向:类型安全边界(边缘验证)、OpenTelemetry用于可观测性、零信任假设、重试幂等性、RFC 9457错误、Postgres + 连接池、结构化日志、超时和速率限制。
快速参考
| 任务 | 默认选择 | 备注 |
|---|---|---|
| REST API | Fastify / Express / NestJS | 偏好类型化边界 + 显式超时 |
| Edge API | Hono / 平台原生处理器 | 保持工作无状态,CPU轻量 |
| 类型安全 API | tRPC | 偏好用于TS monorepos和内部API |
| GraphQL API | Apollo Server / Pothos | 偏好用于复杂客户端驱动查询 |
| 数据库 | PostgreSQL | 使用连接池 + 迁移 + 查询预算 |
| ORM / 查询层 | Prisma / Drizzle / SQLAlchemy / GORM / SeaORM | 偏好显式事务 |
| 身份验证 | OIDC/OAuth + 会话/JWT | 偏好浏览器使用httpOnly cookies |
| 验证 | Zod / Pydantic / 验证库 | 在边界验证,不在深层内部 |
| 缓存 | Redis (或托管) | 使用TTLs + 失效策略 |
| 后台任务 | BullMQ / 平台队列 | 使任务幂等 + 重试安全 |
| 测试 | 单元 + 集成 + 契约/E2E | 保持大多数测试在UI层以下 |
| 可观测性 | 结构化日志 + OpenTelemetry | 端到端关联ID |
范围
使用此技能来:
- 设计和实现REST/GraphQL/tRPC API
- 建模数据模式并运行安全迁移
- 实现身份验证/授权 (OIDC/OAuth, 会话/JWT)
- 添加验证、错误处理、速率限制、缓存和后台任务
- 交付生产就绪(超时、可观测性、部署/运行手册)
何时不使用此技能
使用不同技能当:
- 仅前端关注 -> 参见 software-frontend
- 基础设施供应 (Terraform, K8s清单) -> 参见 ops-devops-platform
- 仅API设计模式(无实现) -> 参见 dev-api-design
- SQL查询优化和索引 -> 参见 data-sql-optimization
- 安全审计和威胁建模 -> 参见 software-security-appsec
- 系统架构(超出单个服务) -> 参见 software-architecture-design
决策树:后端技术选择
后端项目需求: [API类型]
- REST API?
- 简单CRUD -> Express/Fastify + Prisma/Drizzle
- 企业功能 -> NestJS (DI, 模块)
- 高性能 -> Fastify (紧凑请求生命周期)
- Edge/Serverless -> Hono (Cloudflare Workers, Vercel Edge)
- 类型安全API?
- 全栈TypeScript monorepo -> tRPC (无模式,无代码生成)
- 公共API带文档 -> REST + OpenAPI
- 灵活数据获取 -> GraphQL + Pothos/Apollo
- GraphQL API?
- 代码优先 -> Pothos GraphQL (TypeScript)
- 模式优先 -> Apollo Server + GraphQL Codegen
- 运行时选择?
- 企业稳定 -> Node.js (当前LTS)
- 性能关键 -> Bun (验证运行时约束)
- 安全优先 -> Deno (验证平台支持)
- 身份验证策略?
- 浏览器会话 -> httpOnly cookies + 服务器端会话存储
- OAuth/社交 -> OIDC/OAuth库 (或平台身份验证)
- 服务到服务 -> 短期JWT + 可能的mTLS
- 数据库层?
- 类型安全ORM -> Prisma (迁移, Studio)
- SQL优先/性能 -> Drizzle (SQL类API)
- 原始SQL -> 驱动 + 查询构建器 (Kysely/sqlc/SQLx)
- Edge兼容 -> 驱动/ORM + Neon/Turso/D1
- 缓存策略?
- 分布式缓存 -> Redis (多服务器)
- Serverless缓存 -> 托管Redis (例如, Upstash)
- 内存缓存 -> 进程内存 (仅单实例)
- Edge部署?
- 全局低延迟 -> Cloudflare Workers
- Next.js集成 -> Vercel Edge Functions
- AWS生态系统 -> Lambda@Edge
- 后台任务?
- 复杂工作流 -> BullMQ (Redis支持, 重试)
- Serverless工作流 -> AWS Step Functions
- 简单调度 -> cron + 持久存储
运行时和语言替代方案:
- Node.js (当前LTS) (Express/Fastify/NestJS + Prisma/Drizzle):默认用于广泛生态系统 + 成熟工具
- Bun (Hono/Elysia + Drizzle):考虑用于性能敏感工作负载(验证运行时约束)
- Python (FastAPI + SQLAlchemy):强大用于数据密集型服务和ML集成
- Go (Fiber/Gin + GORM/sqlc):强大用于并发和简单部署
- Rust (Axum + SeaORM/SQLx):强大用于安全/性能关键服务
参见 assets/ 获取语言特定起始模板和 references/edge-deployment-guide.md 获取边缘计算模式。
API设计模式 (2025年12月)
幂等性模式
所有变异操作必须支持幂等性以确保重试安全。
实现:
// 幂等性密钥头
const idempotencyKey = request.headers['idempotency-key'];
const cached = await redis.get(`idem:${idempotencyKey}`);
if (cached) return JSON.parse(cached);
const result = await processOperation();
await redis.set(`idem:${idempotencyKey}`, JSON.stringify(result), 'EX', 86400);
return result;
| 做 | 避免 |
|---|---|
| 存储幂等性密钥带TTL (典型24h) | 处理重复请求 |
| 为重复密钥返回缓存响应 | 相同密钥的不同响应 |
| 使用客户端生成UUID | 服务器生成密钥 |
分页模式
| 模式 | 使用时机 | 示例 |
|---|---|---|
| 基于游标 | 大数据集,实时数据 | ?cursor=abc123&limit=20 |
| 基于偏移 | 小数据集,随机访问 | ?page=3&per_page=20 |
| 键集 | 排序数据,高性能 | ?after_id=1000&limit=20 |
偏好基于游标的分页 用于频繁插入的API。
错误响应标准 (问题详情)
使用一致的机器可读错误格式 (RFC 9457 问题详情):https://www.rfc-editor.org/rfc/rfc9457
{
"type": "https://example.com/problems/invalid-request",
"title": "Invalid request",
"status": 400,
"detail": "email is required",
"instance": "/v1/users"
}
健康检查模式
// 存活检查:进程是否运行?
app.get('/health/live', (req, res) => {
res.status(200).json({ status: 'ok' });
});
// 就绪检查:服务能否处理流量?
app.get('/health/ready', async (req, res) => {
const dbOk = await checkDatabase();
const cacheOk = await checkRedis();
if (dbOk && cacheOk) {
res.status(200).json({ status: 'ready', db: 'ok', cache: 'ok' });
} else {
res.status(503).json({ status: 'not ready', db: dbOk, cache: cacheOk });
}
});
迁移回滚策略
| 策略 | 描述 | 使用时机 |
|---|---|---|
| 向后兼容 | 新代码适用于旧模式 | 零停机部署 |
| 扩展-收缩 | 添加新,迁移,移除旧 | 模式变更 |
| 影子表 | 在过渡期间写入两者 | 高风险迁移 |
常见后端错误避免
| 失败避免 | 正确做法 | 原因 |
|---|---|---|
| 在内存中存储会话 | 使用Redis/Upstash | 重启时内存丢失,无水平扩展 |
| 同步文件I/O | 使用 fs.promises 或流 |
阻塞事件循环,杀死吞吐量 |
| 无边界查询 | 始终使用 LIMIT + 游标分页 |
内存耗尽,响应慢 |
| 信任客户端输入 | 使用Zod在API边界验证 | 注入攻击,类型强制错误 |
| 硬编码密钥 | 使用环境变量 + 密钥管理器 (Vault, AWS SM) | 仓库暴露时安全漏洞 |
| N+1数据库查询 | 使用 include/select 或 DataLoader |
10-100倍性能下降 |
生产中使用 console.log |
使用结构化日志 (Pino/Winston) | 无关联ID,不可查询日志 |
| 静默捕获错误 | 日志 + 重新抛出或显式处理 | 隐藏失败,调试噩梦 |
| 缺少连接池 | 使用Prisma连接池或PgBouncer | 负载下连接耗尽 |
| 无请求超时 | 在HTTP客户端和DB查询上设置超时 | 资源泄漏,级联失败 |
安全反模式:
- 失败 不要使用MD5/SHA1作为密码 -> 使用Argon2id
- 失败 不要将JWT存储在localStorage -> 使用httpOnly cookies
- 失败 不要信任
X-Forwarded-For而不验证 -> 配置可信代理 - 失败 不要跳过速率限制 -> 使用滑动窗口 (Redis) 或令牌桶
- 失败 不要记录敏感数据 -> 删除PII、令牌、密码
可选:AI/自动化扩展
注意:AI辅助后端模式。如果不使用AI工具则跳过。
AI辅助代码生成
| 工具 | 使用案例 |
|---|---|
| GitHub Copilot | 内联建议,样板代码 |
| Cursor | AI优先IDE,上下文感知 |
| Claude Code | CLI基础开发 |
审查AI生成代码的要求:
- 所有导入针对package.json验证
- 类型检查器通过(严格模式)
- 安全扫描通过
- 测试覆盖生成代码
基础设施经济学和业务影响
为何重要:后端决策直接影响收入。100ms延迟增加可减少转化率7%。不良架构选择可能导致云支出10倍成本。性能SLA是收入承诺。
成本建模快速参考
| 决策 | 成本影响 | 收入影响 |
|---|---|---|
| Edge vs. Origin | 60-80% 延迟减少 | +2-5% 转化率 |
| Serverless vs. 容器 | 可变成本,缩放到零 | 低规模下更好的单位经济学 |
| 预留 vs. 按需 | 30-60% 成本节省 | 可预测COGS |
| 连接池 | 50-70% 更少DB连接 | 降低数据库成本 |
| 缓存层 | 80-95% 更少源请求 | 减少计算成本 |
性能SLA -> 收入映射
SLA目标 -> 业务指标
P50延迟 < 100ms -> 基础用户体验
P95延迟 < 500ms -> 95%用户满意
P99延迟 < 1000ms -> 企业SLA合规
正常运行时间 99.9% (43.8m 停机/月) -> 标准SLA层
正常运行时间 99.99% (4.4m 停机/月) -> 企业层 ($$$)
单位经济学检查清单
部署任何后端服务前,计算:
- [ ] 每请求成本:总基础设施成本 / 月请求数
- [ ] 每用户成本:总基础设施成本 / 月活跃用户数
- [ ] 毛利率影响:基础设施成本如何影响产品利润率?
- [ ] 规模经济学:在10倍流量下,成本是否线性扩展或更差?
- [ ] 盈亏平衡点:在什么流量水平下此架构回本?
架构决策 -> 业务影响
| 架构选择 | 技术效益 | 业务影响 |
|---|---|---|
| CDN + Edge缓存 | 更低延迟 | 更高转化,更好SEO |
| 读取副本 | 扩展读取 | 处理流量峰值无降级 |
| 基于队列的处理 | 解耦服务 | 高负载期间更平滑UX |
| 多区域部署 | 容错 | 企业SLA合规 |
| 自动扩展 | 适当规模基础设施 | 更低COGS,更好利润率 |
后端团队的FinOps实践
- 标记所有资源 - 每个资源标记
team、service、environment - 设置计费警报 - 在预算50%、80%、100%时警报
- 每周审查 - 15分钟每周成本审查会议
- 每月适当规模 - 检查CPU/内存使用率,缩减过度配置
- 非生产使用Spot/抢占式 - 开发/预演节省60-90%
参见 references/infrastructure-economics.md 获取详细成本建模、云提供商比较和ROI计算器。
导航
资源
- references/backend-best-practices.md - 模板编写指南、质量检查清单和共享实用程序指针
- references/edge-deployment-guide.md - 边缘计算模式、Cloudflare Workers vs Vercel Edge、tRPC、Hono、Bun
- references/infrastructure-economics.md - 成本建模、性能SLA -> 收入、FinOps实践、云优化
- references/go-best-practices.md - Go成语、并发、错误处理、GORM使用、测试、性能分析
- references/rust-best-practices.md - 所有权、异步、Axum、SeaORM、错误处理、测试
- references/python-best-practices.md - FastAPI、SQLAlchemy、异步模式、验证、测试、性能
- data/sources.json - 外部引用按语言/运行时
- 共享检查清单:…/software-clean-code-standard/assets/checklists/backend-api-review-checklist.md, …/software-clean-code-standard/assets/checklists/secure-code-review-checklist.md
共享实用程序 (集中模式 - 提取,不重复)
- …/software-clean-code-standard/utilities/auth-utilities.md - Argon2id, jose JWT, OAuth 2.1/PKCE
- …/software-clean-code-standard/utilities/error-handling.md - Effect结果类型,关联ID
- …/software-clean-code-standard/utilities/config-validation.md - Zod 3.24+, Valibot, 密钥管理
- …/software-clean-code-standard/utilities/resilience-utilities.md - p-retry v6, opossum v8, OTel跨度
- …/software-clean-code-standard/utilities/logging-utilities.md - pino v9 + OpenTelemetry集成
- …/software-clean-code-standard/utilities/testing-utilities.md - Vitest, MSW v2, 工厂, 固定装置
- …/software-clean-code-standard/utilities/observability-utilities.md - OpenTelemetry SDK, 跟踪, 指标
- …/software-clean-code-standard/references/clean-code-standard.md - 规范干净代码规则 (
CC-*) 用于引用
模板
- assets/nodejs/template-nodejs-prisma-postgres.md - Node.js + Prisma + PostgreSQL
- assets/go/template-go-fiber-gorm.md - Go + Fiber + GORM + PostgreSQL
- assets/rust/template-rust-axum-seaorm.md - Rust + Axum + SeaORM + PostgreSQL
- assets/python/template-python-fastapi-sqlalchemy.md - Python + FastAPI + SQLAlchemy + PostgreSQL
相关技能
- …/software-architecture-design/SKILL.md - 系统分解、SLA和数据流
- …/software-security-appsec/SKILL.md - 身份验证/授权和安全API设计
- …/ops-devops-platform/SKILL.md - CI/CD、基础设施和部署安全
- …/qa-resilience/SKILL.md - 弹性、重试和失败剧本
- …/software-code-review/SKILL.md - 后端变更的审查检查清单和标准
- …/qa-testing-strategy/SKILL.md - 测试策略、测试金字塔和覆盖目标
- …/dev-api-design/SKILL.md - RESTful设计、GraphQL和API版本模式
- …/data-sql-optimization/SKILL.md - SQL优化、索引和查询调整模式
新鲜度协议
当用户询问版本敏感建议问题时,在断言“最佳”选择或引用版本前进行快速新鲜度检查。
触发条件
- “用于[用例]的最佳后端框架是什么?”
- “我应该使用什么进行[API设计/身份验证/数据库]?”
- “Node.js/Go/Rust的最新情况是什么?”
- “[REST/GraphQL/tRPC]的当前最佳实践?”
- “[框架/运行时]在2026年是否仍相关?”
- “[Express] vs [Fastify] vs [Hono]?”
- “用于[数据库/用例]的最佳ORM?”
如何新鲜度检查
- 从
data/sources.json开始 (官方文档、发布说明、支持政策)。 - 运行针对特定组件的定向网络搜索并打开发布说明/支持政策页面。
- 偏好官方来源而非博客用于版本和支持窗口。
报告内容
- 当前格局:什么是稳定且广泛使用现在
- 新兴趋势:什么正在获得吸引力(及原因)
- 废弃/下降:什么正在失宠(及原因)
- 推荐:默认选择 + 1-2替代方案,带权衡
示例主题(用新鲜搜索验证)
- Node.js LTS支持窗口和重大变更
- Bun vs Deno vs Node.js
- Hono、Elysia和边缘优先框架
- TypeScript的Drizzle vs Prisma
- tRPC和端到端类型安全
- 边缘计算和serverless模式
操作剧本
- references/operational-playbook.md - 完整后端架构模式、检查清单、TypeScript笔记和决策表