知其然,知其所以然
分布式事务 2026-10-17

幂等接口的设计:同一请求重复提交

实测幂等接口的设计:无幂等的 POST 在 100 ms 超时重试下 200 个请求建了 336 个订单(多 136 个);带 Idempotency-Key 后 0 个重复,慢请求走“超时 → 409 → 重放”;同时到达的 100 对只执行 100 次;同 key 不同内容返回 422;key 过期后会再执行一次;PUT + 外部订单号同样 0 重复且不需要 key 表。

分布式事务 幂等 Idempotency-Key HTTP 重试 MySQL 真实验证 动画演示
分布式事务 2026-10-17

长事务:超时与悬挂的处理

实测长事务的代价:MySQL 一致性快照事务让同一行 6 万次更新后它自己的快照读变成 13.46 ms(新会话 0.04 ms),purge 清完用 49.1 s;行锁超时只回滚那条语句,应用没 ROLLBACK 会提交半截修改;持有元数据锁的事务让 ALTER 和后来的普通 SELECT 一起卡 1.72 s;PostgreSQL idle in transaction 让 25000 个死元组清不掉,idle_in_transaction_session_timeout 能让服务器断开它;watchdog 杀掉 5 个超时事务。

分布式事务 长事务 undo 元数据锁 MySQL PostgreSQL idle in transaction 真实验证 动画演示
分布式事务 2026-10-17

事务补偿的可观测性:状态表与重试

用 saga_log 与 saga_step 状态表让 Saga 可观测:1000 个 saga 在 worker 崩溃、临时失败下可以看到每个卡住的 saga 停在哪一步;恢复守护进程抢 owner 接管后 20 个全部走完、对账 0 不一致;支付服务中断 3 秒时在途数涨到 113,2.0 s 触发告警,守护进程接管 104 个,告警 9.1 s 解除。

分布式事务 Saga 可观测性 状态表 重试 恢复 告警 MySQL 真实验证 动画演示
分布式事务 2026-10-17

跨服务的数据一致性校验

100 万行的两个库跨库校验:count / sum 会漏一加一减;分桶校验和 1.67 s、传输 1095 KiB 发现全部 50 处差异(全量比较 3.6 s、31.4 MiB);各种汇总方式的盲区;updated_at 增量窗口不重叠会漏 33.7%;抽 1% 行只有 32% 的概率发现 35 处差异。

分布式事务 数据一致性校验 校验和 增量校验 抽样 MySQL 真实验证 动画演示
分布式事务 2026-10-17

业务拆分与事务边界:什么时候别拆

同一个下单业务的五种实现:单体、朴素拆分、XA、Saga、订单与库存合并。没有失败时 XA 并发只有单体的 0.27x;有 3% 临时失败时朴素拆分留下 149 个订单已确认却缺项,XA、Saga、合并版对账为 0;合并订单与库存后代码从 44 行降到 24 行。

分布式事务 业务拆分 事务边界 XA Saga MySQL 真实验证 动画演示
网络协议原理 2026-10-16

VPN 隧道的封装:IP-in-UDP 与 MTU 的连锁反应

在 Docker 的 Linux 里搭真的 GRE、VXLAN、WireGuard、IPsec ESP 隧道:每个包额外 +24 / +50 / +60~72 / +55~56 字节;VXLAN 不指定 dev 时 MTU 是 1500 不是 1450;超过隧道 MTU 时带 DF 本地报错、不带 DF 先在内层分片;1% 丢包下分成两个外层包的内层包丢失率 0.99% → 1.73%;TCP 开销 4.6% → 6.3% / 8.3% / 9.2%。

网络协议 VPN 隧道 封装 MTU 分片 WireGuard GRE VXLAN IPsec 真实验证 动画演示
网络协议原理 2026-10-15

分层与封装:一个 HTTP 请求在线上到底多了哪几层头

用 tcpdump 和 dpkt 把一个 HTTP 请求逐层拆开:82 字节的请求在 lo0 上多出 lo0 头 4 字节、IPv4 头 20 字节、TCP 头 32 字节;在真实以太网上再多 14 字节的以太网头,MSS 从 16344 降到 1460;1 MiB 下载头部占 0.35%(lo0)或 4.36%(以太网,公式);自己拼出的 IPv4 头与抓到的字节逐字节吻合。

网络协议 分层 封装 以太网 IPv4 TCP tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

以太网帧:MAC 地址、EtherType、最小帧长与 FCS

在真实网卡上抓 4007 个以太网帧:EtherType 0x0800/0x0806/0x86dd 决定载荷,目的地址分单播 / 广播 / 组播;MAC 第一个字节的两个标志位(本机的随机私有地址 0x7e vs 网关的全局地址 0x70);ARP 请求抓到 42 字节、对方的应答 60 字节,线上最小帧 64;ping -D -s 1472 帧长 1514,1473 被本机拒绝;FCS 抓包里看不到。

网络协议 以太网帧 MAC地址 EtherType 最小帧长 FCS tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

MTU 与 MSS:一个数据包最大能多大

实测 MTU 与 MSS:lo0 的 MTU 16384、en0 的 1500;SYN 里的 MSS = MTU − 40(16344 / 1460),example.com 一侧通告 1400;实际段长还要减 12 字节时间戳选项(16332 / 1388);macOS 上 TCP_MAXSEG 在 connect 前设置不生效;500 字节小块写比 1 MiB 大块写多 31 倍的包、慢 50 多倍。

网络协议 MTU MSS TCP选项 分段 tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

ARP:IP 怎么变成 MAC,缓存、老化与免费 ARP

在真实以太网上看 ARP:邻居表 81 条、网关路由标志 UHLWIir、max_age 1200 s;一次完整解析是 42 字节广播请求 + 60 字节单播应答(93.53 ms);无人应答时每秒重发一个请求、共 5 个,条目停在 (incomplete);30 秒的网段流量里请求 166 个(广播)、应答只抓到 2 个,免费 ARP 12 个、探测 7 个;发往本机自己地址不需要 ARP。

网络协议 ARP 邻居表 免费ARP tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

VLAN 与 802.1Q:帧里多出来的 4 字节

按 IEEE 802.1Q 用 struct 拼出带标签的以太网帧并让 tcpdump 解析(TPID 0x8100,TCI 拆成 PCP / DEI / VID,帧长 +4;Q-in-Q 的 0x88a8 外层标签 +8);这台机器的真实网口 20 秒内没有抓到任何带标签的帧;VLAN 号 12 位、可用 4094 个、PCP 8 级,32768 种组合打包后全部一致。

网络协议 VLAN 802.1Q QinQ 以太网标签 tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

回环接口:发给 127.0.0.1 的包到底走不走网卡

实测回环接口:本机任何本地地址(包括 en0 的地址)的路由出口都是 lo0,连自己的 en0 地址时 lo0 抓到 12 个包、en0 上 0 个;macOS 上只有 127.0.0.1 在 lo0 上,连 127.0.0.2 超时;ping 回环 0.178 ms 对网关 4.211 ms;1 字节乒乓 TCP 20.9 µs、UDP 24.5 µs、Unix 域 6.4 µs,而 1 GiB 灌入 TCP 6654 MiB/s 反超 Unix 域的 1524。

网络协议 回环 lo0 127.0.0.1 Unix域套接字 路由 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号