服务端与数据
API、鉴权、队列、缓存、SQL 和数据建模。 这里的文章按实际问题组织,可以从任意一篇开始。
Node.js 事件循环:别让一段同步代码拖住所有请求
Node.js 擅长并发 I/O,但 JavaScript 仍运行在主线程上。本文用可观测指标、任务分片和 Worker Threads 说明如何处理 CPU 密集型工作。
Express 异步错误处理:让异常只经过一个出口
把业务异常、参数错误和未知故障收敛到统一中间件,避免重复 try/catch、泄露堆栈和一条请求记录多次日志。
API 分页:数据会变化时,用游标代替页码
offset 分页简单,但在数据持续新增或删除时会重复或漏掉记录。本文实现基于 created_at 与 id 的稳定游标分页。
接口幂等:网络重试不应该创建两笔订单
客户端超时后重试是正常行为。对支付、下单等写接口,引入幂等键并在数据库事务中认领请求,才能避免重复副作用。
JWT 登录设计:短访问令牌与可撤销刷新令牌
使用短期 Access Token 处理 API 授权,使用服务端可追踪的 Refresh Token 延长会话,并通过轮换检测令牌重放。
用 Redis 做分布式限流:先定义你想限制什么
多实例服务不能依赖进程内计数器。本文讨论限流维度、Redis 原子操作、响应头和故障降级策略。
OpenAPI 不只写文档:让契约参与请求校验
把 OpenAPI 作为可执行契约:定义统一错误结构、在边界校验输入、生成客户端类型,并在 CI 中检查破坏性变更。
Node.js 文件上传:从流式处理到对象存储确认
安全的上传链路不止一个 multer 配置。本文覆盖流式接收、魔数检测、预签名直传、对象权限和上传确认。
Webhook 接收端:验签、去重和异步消费缺一不可
Webhook 是外部系统主动调用你的接口。接收端需要对原始字节验签、限制时间窗口、按事件 ID 去重并快速返回。
PostgreSQL 事务边界:把不变量留在数据库里
事务不只是 begin 与 commit。本文从库存扣减示例解释业务不变量、原子更新、锁顺序和外部调用边界。
PostgreSQL 索引:从执行计划反推访问路径
通过 EXPLAIN ANALYZE 识别扫描、过滤和排序成本,再围绕高频查询设计复合索引、部分索引和覆盖索引。
PostgreSQL JSONB:灵活字段也需要建模边界
JSONB 适合变化快的附加属性,但高频过滤、关联和强约束字段应保留为普通列。本文给出常用查询与索引策略。
MySQL 死锁:统一加锁顺序,并重试整个事务
死锁不是数据库失控,而是并发事务形成了循环等待。本文介绍报告分析、索引影响、锁顺序和有限重试。
Redis 缓存一致性:先接受短暂旧数据,再设计失效
缓存不是第二个真相来源。以数据库为准,使用 Cache-Aside、版本化 key、随机 TTL 和请求合并控制一致性与稳定性。
数据库连接池:连接越多,不代表吞吐越高
连接池过大会让数据库上下文切换和内存压力上升。本文从部署实例数反推池大小,并设置获取超时、语句超时和泄漏保护。
Prisma 生产迁移:把危险变更拆成可回滚步骤
开发环境的自动迁移不等于生产发布流程。本文使用 expand-contract 分阶段新增字段、回填数据、切换代码并最终收紧约束。
MongoDB 聚合与建模:先按读取路径决定嵌入还是引用
MongoDB 的灵活结构不等于无需建模。本文以订单统计为例,说明嵌入与引用、聚合管道顺序和 explain 分析。