企业应用的最终一致性
Eventual consistency in enterprise application
通过微服务文档和讨论,我明白了通过 XA 协议使用分布式事务并不是确保数据一致性的好选择,因为它会减慢系统速度并且并非所有端点都支持它,例如休息。
建议使用重试机制或消息传递实现最终一致性技术。
我的问题是,是否可以在每个时间点的数据一致性至关重要的企业应用程序中使用最终一致性?最终一致性如何消除脏读?或者换句话说,是否有可能确保没有第 3 方进程获取陈旧数据,这些数据是未提交 "transaction" 的一部分?
好吧,这就是最终一致性的要点:您不能保证没有进程 "is getting stale data"。您的系统将在有限时间内收敛到更新状态。但你不知道什么时候。
使用轻量级补偿模式,您可以查看事务中的每个操作 T(i) 并定义补偿操作 C(i)。然后您可以保证
T(1), ..., T(N) 或
T(1), ..., T(N), C(N), ..., C(1)
执行成功(在有限的时间内...)。即:要么所有操作执行成功,要么所有操作执行相应的补偿后全部撤回。
由于这些操作需要服务之间的协调,而不是 运行 在真实的事务性、孤立的上下文中,当然有可能收到因事务未完全完成或补偿而产生的陈旧数据。
通过微服务文档和讨论,我明白了通过 XA 协议使用分布式事务并不是确保数据一致性的好选择,因为它会减慢系统速度并且并非所有端点都支持它,例如休息。
建议使用重试机制或消息传递实现最终一致性技术。
我的问题是,是否可以在每个时间点的数据一致性至关重要的企业应用程序中使用最终一致性?最终一致性如何消除脏读?或者换句话说,是否有可能确保没有第 3 方进程获取陈旧数据,这些数据是未提交 "transaction" 的一部分?
好吧,这就是最终一致性的要点:您不能保证没有进程 "is getting stale data"。您的系统将在有限时间内收敛到更新状态。但你不知道什么时候。
使用轻量级补偿模式,您可以查看事务中的每个操作 T(i) 并定义补偿操作 C(i)。然后您可以保证
T(1), ..., T(N) 或
T(1), ..., T(N), C(N), ..., C(1)
执行成功(在有限的时间内...)。即:要么所有操作执行成功,要么所有操作执行相应的补偿后全部撤回。
由于这些操作需要服务之间的协调,而不是 运行 在真实的事务性、孤立的上下文中,当然有可能收到因事务未完全完成或补偿而产生的陈旧数据。