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

问题描述

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

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

  • 我只有一个数据库
  • 我有执行操作的微服务 A。假设我将资金存入我的银行账户。此示例中的微服务仅处理存储您的存款和取款,而与您的帐户无关。
  • 微服务 A 完成后,它会通知微服务 B 需要更新帐户余额。
  • 微服务 B 更新账户余额

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

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

解决方法

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

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

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

这是一种常见的性能优化,因为您不希望通过写入排行榜来减慢游戏状态的更新。而且您可能也不希望排行榜基于对所有比赛结果的直接查询,因为这可能需要进行全表扫描(除非结果表可能是按分数排序的)。

在发送异步消息时,您可能在系统中出现不一致,排行榜未反映最新结果。

事实上,如果您认为有足够的争用,那么在排行榜更新时,消息总线上可能会出现新的高分。想象一下,这种情况一直在发生。这样的系统可能永远不会真正达到一致状态,但我们仍然称其为最终一致,因为,如果您想象停止所有外部活动并让系统排空所有异步队列,它会最终进入一个一致的状态。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...