1. Cosmos DB 的 multi-master write 冲突解决中 LWW、custom proc、last-writer-wins 矩阵的边界?
Cosmos DB 的 multi-master write(多主写入)如何解决写冲突?LWW、custom procedure、last-writer-wins 矩阵各自有哪些边界?
- 多主写入的冲突产生
- LWW(last-writer-wins)策略
- 冲突解决策略矩阵的边界
Cosmos DB 支持多主写入,多个区域可同时写同一数据,必然产生冲突。数据库提供可配置的冲突解决策略:1) LWW(Last-Writer-Wins,最后写入者胜):用时间戳(SQL 的 _ts 或自定义属性)决定哪个写入胜出,时间戳最新的覆盖旧的。优点是简单、自动、无需客户端介入;缺点是依赖可信时钟,若时钟漂移或时间戳相同则可能错误覆盖,且丢失"冲突的合并信息"。2) Custom Procedure(自定义冲突解决存储过程):在集合上注册一个自定义存储过程,冲突发生时由数据库在新写入的冲突副本上执行该过程,程序显式合并或丢弃。优点是灵活(可自定义合并语义);缺点是逻辑复杂、需在冲突副本上执行、LWW 无法覆盖的场景仍需手工。3) last-writer-wins 矩阵(冲突解决策略矩阵):Cosmos 按"数据模型(document 或 key-value)"与"冲突解决策略(LWW 或 custom)"组合成矩阵,说明不同组合下冲突如何被处理及边界。边界:LWW 的边界是"无法表达部分合并、受时钟影响、冲突信息丢失";custom proc 的边界是"需保证过程幂等、执行在冲突副本上、跨副本一致收敛取决于过程实现"。建议:多数场景用 LWW 即可;需要合并语义(如计数器、集合、协同编辑)时可考虑自定义过程或改用 CRDT。
多主写入的冲突本质是"并发写的合并"。LWW 以"时间戳最新"为简单排序规则,但丢失了合并语义;custom proc 提供程序化合并但需保证幂等与收敛。边界理解的关键是:LWW 牺牲"合并正确性"换"简单性",custom proc 用"复杂度"换"灵活性",协同编辑等高冲突场景应选 CRDT。