知其然,知其所以然
微服务 2026-10-18

降级:返回缓存或默认值的时机

实测降级:依赖不可用时无降级 100% 报错、502 ms,降级为缓存 0% 报错但仍等 203 ms 的超时,熔断 + 缓存的延迟中位数 0 ms;D 有长尾时超时 50 ms 的 p99 是 53 ms、800 ms 是 608 ms;过载时切到简化模式成功速率 153/s → 300/s(66% 是简化结果)。

微服务 弹性 降级 缓存 熔断 真实验证 动画演示
微服务 2026-10-18

慢节点与对冲请求:p99 被一个慢实例拉高,用冗余换尾延迟

实测慢节点与 hedging:一个慢节点把 p99 从 74 ms 拉到 178 ms、p50 几乎不变;delay 60 ms 的对冲把 p99 压到 135 ms,额外请求 27.8%;偶发长尾下对冲把 p99 从 434 ms 压到 158 ms,但负载接近容量(400/s)时对冲让 p99 从 1876 ms 变成 5754 ms。

微服务 弹性 对冲请求 hedging 尾延迟 慢节点 真实验证 动画演示
微服务 2026-10-18

故障注入与混沌实验:延迟、错误、断连怎么模拟,随机杀实例时的错误率

实测故障注入与混沌实验:TCP 代理注入延迟、重置、黑洞、限速、切碎(切碎时每个请求 14 s 而 2 s 的 socket 超时从不触发);应用层 20% 错误加 20% 慢响应下重试把成功率从 75.5% 拉到 94.2%;随机 kill -9 实例时不重试失败 9.8% 到 12.2%,重试换副本 0.0%。

微服务 弹性 故障注入 混沌实验 kill -9 真实验证 动画演示
微服务 2026-10-18

反向代理的请求流程与配置分层:读头、选 upstream、转发、回写,listener、路由、上游三层

实测 nginx 1.31.6 反向代理改写了什么:Host 默认变成 upstream 组名 u、带下划线的请求头被丢弃、不加 X-Forwarded-For;响应里 Server 被换成 nginx、Keep-Alive 被去掉、内部头原样泄露;listener、server 块、location、upstream 四步如何选出后端。

微服务 网关 nginx 反向代理 proxy_pass 真实验证 动画演示
微服务 2026-10-18

负载均衡算法:nginx upstream 的实际分布,与手写轮询、加权轮询

实测 nginx upstream 的分布:weight=5:1:1 得到 500 / 100 / 100;ip_hash 在所有请求地址相同时 700 个全到同一个后端;least_conn 在一个慢后端时让它只收 115 个、吞吐 325/s → 503/s;手写平滑加权轮询与 nginx 前 14 个选择完全一致。

微服务 网关 nginx 负载均衡 加权轮询 least_conn 真实验证 动画演示
微服务 2026-10-18

一致性哈希:节点增减时有多少 key 被重新映射,与手写实现

实测一致性哈希:取模在加或去掉一个节点时 90% 的 key 搬家,一致性哈希环只搬约 9% 到 10%(vnodes 越多越均匀,不均 2.26 → 1.05);nginx 普通 hash 加一个后端时 79.7% 的 key 归属变化,consistent 只变 23.8% 且全部搬向新节点。

微服务 网关 一致性哈希 nginx ketama 真实验证 动画演示
微服务 2026-10-18

被动健康检查与网关熔断:max_fails、fail_timeout 与摘除失败比例高的节点

实测 nginx 被动健康检查:默认 proxy_next_upstream 不把 503 算失败(client 看到 75 个 503),加 http_503 后 0 个;失败率 2% 的节点被摘除约 10.5 s、份额从 50% 降到 21%(只数次数不看比例);fail_timeout 10 s 时故障结束后 A 约 7.4 到 7.9 s 才恢复。

微服务 网关 nginx 被动健康检查 max_fails fail_timeout 真实验证 动画演示
微服务 2026-10-18

超时三件套:连接、发送、读取超时分别在什么时候触发

实测 nginx 的 proxy_connect/send/read_timeout 各自在什么时候触发(都是约 1 s 504,error.log 位置不同);读取超时是两次读之间的间隔,每 0.4 s 滴一个字节的响应 3.25 s 也不超时;GET 两个上游各等满 1 s 共 2.01 s,next_upstream_timeout 限制的是重试窗口而不是总时长。

微服务 网关 nginx 超时 proxy_read_timeout 真实验证 动画演示
微服务 2026-10-18

proxy_next_upstream:哪些错误会重试到下一个节点,非幂等请求的风险

实测 nginx proxy_next_upstream:默认只重试连接错误与超时,5xx 原样转给 client;加 non_idempotent 后 100 个 POST 里 50 个订单在 A 和 B 重复创建;三个上游全失败时默认放大 3.0 倍,tries 2 / 1 封顶为 2.0 / 1.0。

微服务 网关 nginx proxy_next_upstream 重试 幂等 真实验证 动画演示
分布式事务 2026-10-17

本地事务的边界:一次下单为什么跨了多个库

实测本地事务的边界:同一个实例里余额不足会让订单和库存一起回滚;拆到三个 MySQL 实例后订单和库存已提交、钱没扣;kill -9 调用方进程会停在半截;5% 的单步失败率下 2000 单有 177 单(8.8%)不一致,同样的单放进一个事务是 0。

分布式事务 本地事务 MySQL 一致性 真实验证 动画演示
分布式事务 2026-10-17

两阶段提交:准备与提交阶段的阻塞

用两个真实的 PostgreSQL 实例和一个手写协调者实测两阶段提交:prepare 之后修改不可见、断开连接和 kill -9 后事务与行锁仍在;一次提交从 1 次变成 4 次 WAL fsync,中位数慢 6.9 倍;同一行上吞吐 = 1000/(hold + 3.3 ms)。

分布式事务 两阶段提交 2PC PostgreSQL PREPARE TRANSACTION 真实验证 动画演示
分布式事务 2026-10-17

2PC 的故障场景:协调者崩溃时参与者卡在哪

实测 2PC 里协调者在五个位置被 kill -9:参与者停在已承诺等决定的状态,行锁一直握着(同一行 UPDATE 等到超时)并挡住 VACUUM;参与者自己回滚会造成不一致;有决定日志可恢复,没有日志位置 4 不一致;先发 COMMIT PREPARED 再写日志也不一致。

分布式事务 两阶段提交 2PC 协调者崩溃 PostgreSQL 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号