微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决与一个数据库的最终一致性

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

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

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

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

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

解决方法

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

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。