CATEGORY / 17

服务端与数据

API、鉴权、队列、缓存、SQL 和数据建模。 这里的文章按实际问题组织,可以从任意一篇开始。

服务端与数据9 分钟

Node.js 事件循环:别让一段同步代码拖住所有请求

Node.js 擅长并发 I/O,但 JavaScript 仍运行在主线程上。本文用可观测指标、任务分片和 Worker Threads 说明如何处理 CPU 密集型工作。

Node.jsEvent LoopPerformanceWorker Threads
服务端与数据8 分钟

Express 异步错误处理:让异常只经过一个出口

把业务异常、参数错误和未知故障收敛到统一中间件,避免重复 try/catch、泄露堆栈和一条请求记录多次日志。

ExpressError HandlingLoggingAPI
服务端与数据10 分钟

API 分页:数据会变化时,用游标代替页码

offset 分页简单,但在数据持续新增或删除时会重复或漏掉记录。本文实现基于 created_at 与 id 的稳定游标分页。

REST APIPaginationPostgreSQLCursor
服务端与数据11 分钟

接口幂等:网络重试不应该创建两笔订单

客户端超时后重试是正常行为。对支付、下单等写接口,引入幂等键并在数据库事务中认领请求,才能避免重复副作用。

IdempotencyREST APIPostgreSQLReliability
服务端与数据12 分钟

JWT 登录设计:短访问令牌与可撤销刷新令牌

使用短期 Access Token 处理 API 授权,使用服务端可追踪的 Refresh Token 延长会话,并通过轮换检测令牌重放。

JWTAuthenticationSecurityCookies
服务端与数据11 分钟

用 Redis 做分布式限流:先定义你想限制什么

多实例服务不能依赖进程内计数器。本文讨论限流维度、Redis 原子操作、响应头和故障降级策略。

RedisRate LimitingLuaSecurity
服务端与数据9 分钟

OpenAPI 不只写文档:让契约参与请求校验

把 OpenAPI 作为可执行契约:定义统一错误结构、在边界校验输入、生成客户端类型,并在 CI 中检查破坏性变更。

OpenAPIValidationContract TestingTypeScript
服务端与数据12 分钟

Node.js 文件上传:从流式处理到对象存储确认

安全的上传链路不止一个 multer 配置。本文覆盖流式接收、魔数检测、预签名直传、对象权限和上传确认。

File UploadStreamsS3Security
服务端与数据10 分钟

Webhook 接收端:验签、去重和异步消费缺一不可

Webhook 是外部系统主动调用你的接口。接收端需要对原始字节验签、限制时间窗口、按事件 ID 去重并快速返回。

WebhookHMACSecurityQueue
服务端与数据13 分钟

PostgreSQL 事务边界:把不变量留在数据库里

事务不只是 begin 与 commit。本文从库存扣减示例解释业务不变量、原子更新、锁顺序和外部调用边界。

PostgreSQLTransactionConcurrencyConstraints
服务端与数据12 分钟

PostgreSQL 索引:从执行计划反推访问路径

通过 EXPLAIN ANALYZE 识别扫描、过滤和排序成本,再围绕高频查询设计复合索引、部分索引和覆盖索引。

PostgreSQLIndexEXPLAINPerformance
服务端与数据10 分钟

PostgreSQL JSONB:灵活字段也需要建模边界

JSONB 适合变化快的附加属性,但高频过滤、关联和强约束字段应保留为普通列。本文给出常用查询与索引策略。

PostgreSQLJSONBGINData Modeling
服务端与数据12 分钟

MySQL 死锁:统一加锁顺序,并重试整个事务

死锁不是数据库失控,而是并发事务形成了循环等待。本文介绍报告分析、索引影响、锁顺序和有限重试。

MySQLInnoDBDeadlockTransaction
服务端与数据12 分钟

Redis 缓存一致性:先接受短暂旧数据,再设计失效

缓存不是第二个真相来源。以数据库为准,使用 Cache-Aside、版本化 key、随机 TTL 和请求合并控制一致性与稳定性。

RedisCacheConsistencyPerformance
服务端与数据10 分钟

数据库连接池:连接越多,不代表吞吐越高

连接池过大会让数据库上下文切换和内存压力上升。本文从部署实例数反推池大小,并设置获取超时、语句超时和泄漏保护。

Connection PoolPostgreSQLNode.jsObservability
服务端与数据11 分钟

Prisma 生产迁移:把危险变更拆成可回滚步骤

开发环境的自动迁移不等于生产发布流程。本文使用 expand-contract 分阶段新增字段、回填数据、切换代码并最终收紧约束。

PrismaMigrationPostgreSQLDeployment
服务端与数据12 分钟

MongoDB 聚合与建模:先按读取路径决定嵌入还是引用

MongoDB 的灵活结构不等于无需建模。本文以订单统计为例,说明嵌入与引用、聚合管道顺序和 explain 分析。

MongoDBAggregationData ModelingIndex