Skip to content

模式如何协作 ​

这些模式不是孤立存在的。最有价值的洞察是生产系统如何将它们组合在一起。

交互式探索 — 点击任意系统查看它使用了哪些模式及其原因:

组合链路 ​

最有价值的洞察不是有哪些模式存在 — 而是它们在真实系统中如何链式组合。

React Reconciler:从标志位到帧 ​

text
Bitmask          → 标志位编码需要做什么工作
    ↓
Dirty Flag       → 跳过未变更的子树
    ↓
Min Heap         → 先挑最高优先级的工作
    ↓
Cooperative Scheduling → 每 5ms 让出避免卡顿
    ↓
Diff / Patch     → 计算最小树变更
    ↓
Double Buffering → 构建 workInProgress 树,原子交换
    ↓
Batch Processing → 一次提交刷新所有状态更新

PostgreSQL:从写入到恢复 ​

text
Write-Ahead Log  → 每次修改先写日志再应用
    ↓
Checkpointing    → 定期快照限制崩溃恢复时的重放量
    ↓
B+ Tree          → 磁盘优化索引支持范围查询
    ↓
MVCC             → 读者看到一致快照,永不阻塞写者
    ↓
LRU Cache        → 缓冲池将热页面保持在内存中
    ↓
Bloom Filter     → 跳过对不存在键的索引查找

Kafka Broker:从生产者到消费者 ​

text
Batch Processing → 累积消息,批量 fsync
    ↓
Write-Ahead Log  → 磁盘上的追加日志段
    ↓
Ring Buffer      → 固定大小 I/O 事件队列
    ↓
Backpressure     → 慢消费者信号生产者节流
    ↓
Consistent Hashing → 跨 broker 分区分配
    ↓
Tombstone        → 日志压缩移除过期记录

Go Runtime:调度 + 内存 ​

text
Work Stealing    → 空闲 P 从忙碌 P 的队列偷取 goroutine
    ↓
Semaphore        → GOMAXPROCS 限制并发 OS 线程
    ↓
Object Pool      → sync.Pool 回收频繁分配的对象
    ↓
Free List        → mspan 追踪 size class 中的空闲槽位
    ↓
Arena Allocator  → 栈帧以 bump pointer 方式分配
    ↓
Copy-on-Write    → slice append 容量不足时才复制

全局视角 ​

理解单个模式有用。理解它们如何组合才是区分高级工程师和初级工程师的关键。

当你遇到性能问题时,你不会想"我需要一个 bitmask"。你会想"我需要低成本追踪多个状态(bitmask)、跳过未变更的部分(subtree flags)、增量处理工作(cooperative scheduling)、优先处理紧急任务(min heap)、在热路径上避免分配(double buffering)。"

这就是 React 团队构建的。这就是 Redis、Go、Linux、PostgreSQL 和 Kafka 都在展示的。相同的模式以不同的配置重新组合,解决不同的问题。

总结:跨系统的模式分布 ​

模式ReactRedisGo RuntimeLinuxPostgreSQLKafka
位掩码✅✅✅
最小堆✅✅✅
协作调度✅✅
差异/补丁✅
双缓冲✅
批处理✅✅✅✅
脏标记✅
观察者✅
跳表✅
LRU 缓存✅✅✅
Trie 前缀树✅✅
布隆过滤器✅
工作窃取✅
空闲链表✅✅
信号量✅✅
对象池✅
享元✅
限流器✅✅
Arena 分配器✅
状态机✅
环形缓冲区✅✅
背压✅✅
虚函数表✅
引用计数✅
写时复制✅✅✅
墓碑✅
MVCC✅
预写日志✅✅
B+ 树✅✅
检查点✅✅
事件循环✅✅✅
迭代器✅✅
标签联合体✅✅
指数退避重试✅
一致性哈希✅✅

其他系统中的锚点模式 ​

剩余 11 个模式主要存在于上述六大系统之外:

模式主要系统
LSM 树LevelDB、RocksDB — 现代 KV 存储的核心写入引擎
合并迭代器LevelDB、RocksDB — 压缩时的 K 路归并
逻辑时钟etcd(Raft term/index)、LevelDB(序列号)
Merkle 树Git(对象完整性校验)、ZFS(块校验和)
Actor 模型Erlang/OTP、Akka — 消息传递并发
熔断器Netflix Hystrix、gobreaker — 微服务弹性
中间件链gRPC-Go 拦截器、Koa.js 洋葱模型
注册表TensorFlow(算子注册)、gRPC-Go(服务注册)
依赖图Cargo(构建解析)、pnpm(工作区调度)
访问者LLVM(InstVisitor)、Vue 编译器(AST 转换)
驻留rustc(符号驻留)、CPython(字符串/整数缓存)

基于 MIT 许可证发布。