与一个数据库的最终一致性

Eventual Consistency With One Database

最终一致性是否仅涵盖数据复制(相同数据的副本):

举一个没有相同数据副本的例子:

在这个例子中,在存款和账户更新余额之间有一段时间,余额将“不正确”。

这是最终一致性的一个例子吗——尽管有一个数据库,但我的数据不会立即讲述完整的故事......但它会最终...... :)

您可以轻松地与单个数据库实现最终一致性。让我们放弃涉及金钱交易的例子,因为这似乎会引起很多感受和意见。

相反,考虑一个跟踪在线游戏的数据库。每当您赢得比赛时,数据库会立即存储比赛结果。它还会在异步 pub/sub 总线上发布一个事件,其中包含有关结果的信息。

一位订阅者获取信息并可以使用它来更新排行榜。

这是一个常见的性能优化,因为您不想通过写入排行榜来减慢游戏状态的更新速度 table。而且您可能也不希望排行榜基于对所有匹配结果的直接查询,因为这可能需要完整的 table 扫描(除非结果 table 按分数排序,也许)。

当异步消息在途中时,您可能在排行榜不反映最新结果的系统中遇到不一致。

事实上,如果您认为有足够的竞争,当排行榜更新时,新的高分可能正在通过消息总线发送。想象一下,这种情况一直在发生。这样的系统可能永远不会真正达到一致状态,但我们仍然称它为 最终一致 因为,如果你想象你停止所有外部 activity 并让系统耗尽所有异步队列,它将最终进入一致状态。

上面的例子是基于异步和一些非规范化的,但在这种情况下,即使在单个数据库上,您也可以轻松设计最终一致的系统。