分布式系统中的模式
高吞吐消息系统和交易系统将吞吐模式推向极限。
| 模式 | 项目 | 位置 | 作用 |
|---|---|---|---|
| 环形缓冲区 | LMAX Disruptor | RingBuffer.java | 每秒 600 万笔订单的核心数据结构 |
| 批处理 | Apache Kafka | RecordAccumulator.java | 按分区累积记录为批次提升吞吐 |
| 熔断器 | Netflix Hystrix | HystrixCircuitBreaker.java | 微服务弹性的三态熔断器 |
| 熔断器 | Sony gobreaker | gobreaker.go | 带代计数器防过期检测的 Go 熔断器 |
| 背压 | Reactive Streams | Subscription.java | request(n) 拉模型流控规范 |
| 预写日志 | etcd | wal.go | Raft 共识 WAL——分布式状态的事实来源 |
| 预写日志 | PostgreSQL | xlog.c | 事务 WAL 用于崩溃恢复、复制、PITR |
| MVCC | PostgreSQL | heapam_visibility.c | HeapTupleSatisfiesMVCC — 快照隔离可见性检查 |
| MVCC | etcd | kvstore.go | 多版本键值存储,驱动 Kubernetes 配置 |
| 一致性哈希 | groupcache | consistenthash.go | 带虚拟副本的哈希环,用于分布式缓存 |
| Actor 模型 | Akka | Actor.scala | trait Actor — JVM 上的消息驱动并发 |
| Actor 模型 | Erlang/OTP | erl_process.h | BEAM VM 进程结构体 — 带信箱的轻量级 Actor |
| 限流器 | Nginx | ngx_http_limit_req_module.c | HTTP 请求的漏桶限流 |
| 逻辑时钟 | etcd | mvcc/revision.go | 单调递增修订号,用于集群内事件排序 |
| 逻辑时钟 | LevelDB | db_impl.cc 序列号 | 序列号排序所有写入,无需墙钟时间 |
| 指数退避重试 | Kubernetes | backoff.go | Pod 重启退避、API Server 指数延迟重试 |
| 墓碑 | Cassandra | Tombstone 标记 | 分布式删除传播中的删除标记 |
| LSM 树 | LevelDB | db_impl.cc | 内存缓冲写入,刷入有序文件,后台合并 |
| 检查点 | PostgreSQL | checkpointer.c | 周期性快照,限制崩溃恢复时 WAL 回放时间 |
模式如何组合:一次分布式写入
当客户端向 etcd 等分布式数据库写入一个键时,模式在整条路径上依次串联:
客户端: PUT /key "value"▼这些模式形成了一条持久化流水线:限流器保护系统,一致性哈希路由请求,WAL 确保持久性,逻辑时钟排序事件,MVCC 提供隔离性,检查点限定恢复时间。