知识卡片

宽松地解释约束:补偿性事务与无协调数据系统

普通读书笔记卡

内容

执行严格的唯一性约束终究需要共识(通常靠把特定分区的事件汇聚到单个节点决策),流处理也不能例外。但许多真实应用其实可以接受远弱于此的约束语义:两人同时抢注同一用户名或预订同一座位,可以给其中一人道歉并要求换一个(补偿性事务);客户订购的商品数超过库存,可以补货加道歉折扣(既然叉车轧坏货物这类物理事故本就要求这套道歉流程存在,那对库存数目施加线性一致约束就未必必要);航空公司超卖机票、酒店超卖客房都是故意违反”一人一座”来对赌部分人会取消;银行允许账户超额取款、靠透支费和每日限额控制风险。道歉的成本通常远低于严格约束的协调成本(发一封更正邮件、退一笔重复扣款),这类应用真正需要的是完整性(不能弄丢预订、不能借贷不平)而非及时性(约束可以事后修正)——这与[[写冲突的检测时机与收敛策略最后写入胜利的数据丢失代价]]所属的多主复制冲突解决思路相通。由此得出一个更一般的观察:数据流系统能在不需要原子提交、线性一致性或同步跨分区协调的前提下维持衍生数据的完整性保证;同时很多应用能接受约束被临时违反、事后修复。两者叠加意味着无协调数据系统对许多应用是可行的——性能与容错能力都优于需要同步协调的系统,可以用多领导者配置跨多个数据中心异步复制运维,同步协调仍可以留给真正需要严格约束(如不可挽回操作前的强制校验)的局部场景,没必要让所有操作都承担协调的代价。

参考来源

- 位置:《数据密集型应用系统设计》第十二章《数据系统的未来》"宽松地解释约束""无协调数据系统"(源文件:_epub-src/ch12_split_002.html) - 结论依据:原文用用户名/座位/库存/超卖机票/银行透支等例子说明许多应用能接受宽松约束+道歉修复的模式,并总结数据流系统无需同步协调即可维持完整性,两者叠加意味着无协调数据系统对许多应用可行,直接支撑本卡片结论。 - 原始内容:如果两个人同时注册了相同的用户名或预订了相同的座位,你可以给其中一个人发消息道歉……道歉的成本是否能接受是一个商业决策……数据流系统可以为许多应用提供无需协调的数据管理服务,且仍能给出很强的完整性保证。