与一个数据库的最终一致性
Eventual Consistency With One Database
最终一致性是否仅涵盖数据复制(相同数据的副本):
举一个没有相同数据副本的例子:
- 我只有一个数据库。
- 我有执行操作的微服务 A。假设我将资金存入我的银行账户。此示例中的微服务仅处理存储您的存款和取款,但与您的帐户无关。
- 微服务 A 完成后,它会通知微服务 B 它需要更新帐户余额。
- 微服务 B 更新账户余额
在这个例子中,在存款和账户更新余额之间有一段时间,余额将“不正确”。
这是最终一致性的一个例子吗——尽管有一个数据库,但我的数据不会立即讲述完整的故事......但它会最终...... :)
您可以轻松地与单个数据库实现最终一致性。让我们放弃涉及金钱交易的例子,因为这似乎会引起很多感受和意见。
相反,考虑一个跟踪在线游戏的数据库。每当您赢得比赛时,数据库会立即存储比赛结果。它还会在异步 pub/sub 总线上发布一个事件,其中包含有关结果的信息。
一位订阅者获取信息并可以使用它来更新排行榜。
这是一个常见的性能优化,因为您不想通过写入排行榜来减慢游戏状态的更新速度 table。而且您可能也不希望排行榜基于对所有匹配结果的直接查询,因为这可能需要完整的 table 扫描(除非结果 table 按分数排序,也许)。
当异步消息在途中时,您可能在排行榜不反映最新结果的系统中遇到不一致。
事实上,如果您认为有足够的竞争,当排行榜更新时,新的高分可能正在通过消息总线发送。想象一下,这种情况一直在发生。这样的系统可能永远不会真正达到一致状态,但我们仍然称它为 最终一致 因为,如果你想象你停止所有外部 activity 并让系统耗尽所有异步队列,它将最终进入一致状态。
上面的例子是基于异步和一些非规范化的,但在这种情况下,即使在单个数据库上,您也可以轻松设计最终一致的系统。
最终一致性是否仅涵盖数据复制(相同数据的副本):
举一个没有相同数据副本的例子:
- 我只有一个数据库。
- 我有执行操作的微服务 A。假设我将资金存入我的银行账户。此示例中的微服务仅处理存储您的存款和取款,但与您的帐户无关。
- 微服务 A 完成后,它会通知微服务 B 它需要更新帐户余额。
- 微服务 B 更新账户余额
在这个例子中,在存款和账户更新余额之间有一段时间,余额将“不正确”。
这是最终一致性的一个例子吗——尽管有一个数据库,但我的数据不会立即讲述完整的故事......但它会最终...... :)
您可以轻松地与单个数据库实现最终一致性。让我们放弃涉及金钱交易的例子,因为这似乎会引起很多感受和意见。
相反,考虑一个跟踪在线游戏的数据库。每当您赢得比赛时,数据库会立即存储比赛结果。它还会在异步 pub/sub 总线上发布一个事件,其中包含有关结果的信息。
一位订阅者获取信息并可以使用它来更新排行榜。
这是一个常见的性能优化,因为您不想通过写入排行榜来减慢游戏状态的更新速度 table。而且您可能也不希望排行榜基于对所有匹配结果的直接查询,因为这可能需要完整的 table 扫描(除非结果 table 按分数排序,也许)。
当异步消息在途中时,您可能在排行榜不反映最新结果的系统中遇到不一致。
事实上,如果您认为有足够的竞争,当排行榜更新时,新的高分可能正在通过消息总线发送。想象一下,这种情况一直在发生。这样的系统可能永远不会真正达到一致状态,但我们仍然称它为 最终一致 因为,如果你想象你停止所有外部 activity 并让系统耗尽所有异步队列,它将最终进入一致状态。
上面的例子是基于异步和一些非规范化的,但在这种情况下,即使在单个数据库上,您也可以轻松设计最终一致的系统。