Skip to content

分布式系统中的模式

高吞吐消息系统和交易系统将吞吐模式推向极限。

模式项目位置作用
环形缓冲区LMAX DisruptorRingBuffer.java每秒 600 万笔订单的核心数据结构
批处理Apache KafkaRecordAccumulator.java按分区累积记录为批次提升吞吐
熔断器Netflix HystrixHystrixCircuitBreaker.java微服务弹性的三态熔断器
熔断器Sony gobreakergobreaker.go带代计数器防过期检测的 Go 熔断器
背压Reactive StreamsSubscription.javarequest(n) 拉模型流控规范
预写日志etcdwal.goRaft 共识 WAL——分布式状态的事实来源
预写日志PostgreSQLxlog.c事务 WAL 用于崩溃恢复、复制、PITR
MVCCPostgreSQLheapam_visibility.cHeapTupleSatisfiesMVCC — 快照隔离可见性检查
MVCCetcdkvstore.go多版本键值存储,驱动 Kubernetes 配置
一致性哈希groupcacheconsistenthash.go带虚拟副本的哈希环,用于分布式缓存
Actor 模型AkkaActor.scalatrait Actor — JVM 上的消息驱动并发
Actor 模型Erlang/OTPerl_process.hBEAM VM 进程结构体 — 带信箱的轻量级 Actor
限流器Nginxngx_http_limit_req_module.cHTTP 请求的漏桶限流
逻辑时钟etcdmvcc/revision.go单调递增修订号,用于集群内事件排序
逻辑时钟LevelDBdb_impl.cc 序列号序列号排序所有写入,无需墙钟时间
指数退避重试Kubernetesbackoff.goPod 重启退避、API Server 指数延迟重试
墓碑CassandraTombstone 标记分布式删除传播中的删除标记
LSM 树LevelDBdb_impl.cc内存缓冲写入,刷入有序文件,后台合并
检查点PostgreSQLcheckpointer.c周期性快照,限制崩溃恢复时 WAL 回放时间

模式如何组合:一次分布式写入

当客户端向 etcd 等分布式数据库写入一个键时,模式在整条路径上依次串联:

客户端: PUT /key "value"
1
限流器

网关应用令牌桶防止单个客户端压垮集群。

2
一致性哈希

路由器确定哪个节点拥有此 key。虚拟节点确保即使节点加入/离开时负载仍保持均衡。

3
预写日志

修改状态前,leader 将操作追加到磁盘上的 WAL。若进程崩溃,重放恢复状态。

4
逻辑时钟

写入获得单调递增的修订号。无需墙钟同步 — 所有节点通过修订号达成排序共识。

5
MVCC

新版本与旧版本并存。并发读者看到一致性快照而不阻塞写入。

6
检查点

系统定期生成快照。后续崩溃恢复仅重放最后一个检查点之后的 WAL 条目。

这些模式形成了一条持久化流水线:限流器保护系统,一致性哈希路由请求,WAL 确保持久性,逻辑时钟排序事件,MVCC 提供隔离性,检查点限定恢复时间。

延伸阅读

基于 MIT 许可证发布。