知识卡片
内部一致性与外部一致性的区分决定了从编程问题到架构问题的转变
内容
事务的目的是保证数据一致性,但”一致性”在单数据源和多数据源场景下的实现 难度天差地别。当一个服务只用一个数据源时,并发事务的读写冲突和最终执行 顺序都由这一个数据源自己感知和裁决,靠原子性/隔离性/持久性(A/I/D)就能 获得一致性,这被称为”内部一致性”,是相对容易的经典做法。一旦一个服务用到 多个数据源,甚至多个服务同时涉及多个数据源,情况就变得棘手——此时事务的 执行顺序不再由任何单一数据源决定,这类跨数据源的一致性被称为”外部一致性”, 用A/I/D几乎无法解决,或者代价大到不现实。这个区分带来一个关键的观念转变: 一致性不再是”是或否”的二元判断,而要被拆成可以按不同强度分开讨论的多元 属性,在代价可承受的前提下追求尽可能高的一致性保障——这正是事务处理从 一个具体的”编程问题”(调API开关事务)升级为需要全局权衡的”架构问题”(选 哪种一致性策略)的分水岭。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第3章"事务处理"引言
(源文件:_epub-src对应OEBPS/Text/chapter24.xhtml)
- 结论依据:原文明确区分单数据源场景下事务读写顺序由数据源自身裁决的
"内部一致性",与涉及多数据源、执行顺序不由任何单一数据源决定的"外部
一致性",并指出因此一致性需要从二元属性转变为多元强度问题,事务处理
从编程问题上升为架构问题,直接支撑本卡片结论。
- 原始内容:外部一致性问题通常很难使用A、I、D来解决,因为这样需要付出
很大甚至不切实际的代价;但是外部一致性又是分布式系统中必然会遇到且
必须要解决的问题,为此我们要转变观念,将一致性从"是或否"的二元属性
转变为可以按不同强度分开讨论的多元属性。