知识卡片
及时性与完整性的区分
内容
“一致性”这个词经常混淆了两个应当分开考虑的需求。及时性指用户能观察到系统的最新状态——若从陈旧副本读取,会观察到系统处于不一致状态,但这种不一致是暂时的,靠等待与重试就能解决([[线性一致性的精确定义与仿佛只有一份副本的错觉]]是实现及时性的一种强有力方式,[[复制延迟催生的三种一致性异常读己之写单调读一致前缀读]]里读己之写这类较弱形式同样有用)。完整性指没有损坏——没有数据丢失、没有矛盾或错误的数据,尤其当某些数据集是作为底层数据视图维护时,这种衍生必须正确(数据库索引必须准确反映数据库内容,缺记录的索引没有用)。若违反完整性,这种不一致是永久的,等待重试无济于事,必须显式检查修复——用口号总结:违反及时性是”最终一致性”,违反完整性是”永无一致性”。作者断言:多数应用里完整性远比及时性重要,违反及时性令人困惑讨厌,违反完整性的后果可能是灾难性的——信用卡账单上24小时内的交易尚未出现并不奇怪(及时性本就不重要),但如果本期余额与上期加总对不上、或出现一笔向你收费却没付给商家的”消失的钱”,那就是真正的灾难。ACID事务通常把及时性(线性一致性)和完整性(原子提交)打包在一起,让二者的区分显得无关紧要;而[[基于日志消息传递实现唯一性约束与多分区请求处理]]所属的基于事件的数据流系统天然把两者分开:异步处理无法保证及时性(除非显式等待特定消息),但完整性本身才是流处理系统的核心关切。
参考来源
- 位置:《数据密集型应用系统设计》第十二章《数据系统的未来》"及时性与完整性"(源文件:_epub-src/ch12_split_002.html)
- 结论依据:原文区分及时性(观察系统最新状态,违反是暂时的、可等待恢复)与完整性(无损坏,违反是永久的、需显式修复),并用信用卡账单为例说明多数应用中完整性远比及时性重要,直接支撑本卡片结论。
- 原始内容:及时性意味着确保用户观察到系统的最新状态……完整性意味着没有损坏……口号形式:违反及时性,"最终一致性";违反完整性,"永无一致性"……我断言在大多数应用中,完整性比及时性重要得多。