📦 开源仓库:learn_crdt_merge · 纯 Python 标准库 · 学习演示项目
多副本并发写同一份数据,同步时怎么合并?协调者仲裁?太重。CRDT(Conflict-free Replicated Data Type)直接在数据结构层面消灭冲突:只要合并运算满足交换律、结合律、幂等性,所有副本最终必然收敛到同一状态——不需要主节点、不需要锁、不需要协商。
核心思路
副本 A:计数 +2 副本 B:计数 +1
│ │
└───────── 同步 / 合并 ─────────┘
│
▼
逐槽取 max → 两个副本都 = 3(收敛)
- G-Counter:每个副本只写自己的槽位,合并 = 逐槽取 max
- OR-Set:添加带唯一标签,删除只记标签;元素存活当且仅当它的添加标签没被删光——并发的添加+删除永不丢更新
- 无 leader、无锁、无协商,合并结果确定且与顺序无关
为什么值得学
- 离线优先/协作应用:断网随便编辑,联网自动合并,没有冲突弹窗
- 高可用:副本本地直接接写,不用等协调者往返
- 强最终一致性白送:合并数学保证收敛
演示场景
- G-Counter:A 加两次、B 加一次,合并后双方都是 3
- OR-Set:s1 加
x,s2 并发删x又加y,合并后双方都有x和y——不丢更新、不报冲突
运行
python run_all.py
纯 Python 标准库,零第三方依赖,一键跑完所有演示场景后自动退出。
仓库:github.com/yxpil/learn_crdt_merge,欢迎 Star 与提 Issue。