知识卡片

最终一致性:暂时不一致不可避免,且适用于所有远程通信

普通读书笔记卡

内容

传统ACID事务把不同客户端相互隔离,提交前谁也看不到别人的中间修改;但当任务分散到多个远程服务时,这种隔离度荡然无存——中间步骤所做的变更会立刻对所有人实时可见。在入网例子里,用户已经在CRM系统可见但还没进账单系统,这违反了”用户应同时存在于两个系统”的不变式,这种状态就是不一致。关键认知是:这类暂时的不一致是不可避免的,你必须理解它可能引发的失败场景——比如用户信息已进CRM但还没进账单系统时,营销活动完全可能已经把他们纳入,即便最终订单被拒、用户没能真正激活,他们依然可能已经收到了升级版广告;良好设计的系统边界要确保中间状态不会对外部世界”造成实质伤害”,或者至少要清楚知道它会带来什么影响,并思考消除不一致的具体策略——最终一致性的含义就是:系统终会靠某种机制回到一致状态(比如账单系统写入失败时反过来在CRM系统暂停这个用户)。这个道理不局限于微服务场景,[[ACID事务的边界局限跨服务通信为何无法沿用ACID]]描述的取舍适用于任何形式的远程通信:即便只是简单一次REST调用,比如支付服务调用信用卡服务扣款时遇到网络异常,你根本无法确定信用卡到底扣没扣成功——只要发生了一次远程调用,就已经踏进了最终一致性的世界,必须提前想清楚该如何检测和恢复一致状态(比如检查是否已扣款、调用清理API、或直接发起撤销扣款)。

参考来源

- 位置:《流程自动化实战:系统架构和软件开发视角》第9章《工作流引擎与集成挑战》"9.2.1 最终一致性""9.3 最终一致性适用于各种形式的远程通信"(源文件:_epub-src/EPUB/xhtml/Section0001_0013.xhtml) - 结论依据:原文用用户已现身CRM但未入账单系统时仍可能收到营销活动的例子说明暂时不一致的实际影响,并用信用卡扣费网络异常的例子说明最终一致性不局限于微服务、适用于任何一次远程调用,直接支撑本卡片结论。 - 原始内容:这违反了一个不变的原则,即用户要同时存在于CRM系统和账单系统中……最终一致性这一术语的意思就是,你需要采取措施,使系统最终回到一致的状态……这个例子很好地说明了你在进行第一次远程调用时就进入了最终一致性的世界。