gpt4 book ai didi

database - 数据库与微服务的一致性

转载 作者:太空狗 更新时间:2023-10-30 01:39:06 24 4
gpt4 key购买 nike

在基于微服务的系统中实现数据库一致性的最佳方法是什么?

GOTO in Berlin ,Martin Fowler 在谈论微服务,他提到的一个“规则”是保留“每个服务”的数据库,这意味着服务不能直接连接到另一个服务“拥有”的数据库。

这是 super 漂亮和优雅的,但在实践中它变得有点棘手。假设您有一些服务:

  • 前端
  • 订单管理服务
  • 忠诚度计划服务

现在,客户在您的前端进行购买,这将调用订单管理服务,该服务会将所有内容保存在数据库中——没问题。此时,还会调用忠诚度计划服务,以便它从您的帐户中记入/借记积分。

现在,当所有内容都在同一个数据库/数据库服务器上时,一切都变得简单了,因为您可以在一个事务中运行所有内容:如果忠诚度计划服务无法写入数据库,我们可以回滚整个过程。

当我们在多个服务中执行数据库操作时,这是不可能的,因为我们不依赖一个连接/利用运行单个事务。让事情保持一致并过上幸福生活的最佳模式是什么?

我非常渴望听到您的建议!..提前致谢!

最佳答案

This is super-nice and elegant but in practice it becomes a bit tricky

“在实践中”的意思是,您需要设计微服务,以便在遵循规则时满足必要的业务一致性:

that services cannot directly connect to a DB "owned" by another service.

换句话说 - 不要对他们的职责做出任何假设,并根据需要更改边界,直到您找到实现该工作的方法。

现在,回答你的问题:

What are the best patterns to keep things consistent and live a happy life?

对于不需要立即保持一致且更新忠诚度积分似乎属于此类的事情,您可以使用可靠的发布/订阅模式从一个微服务中分派(dispatch)事件以供其他微服务处理。可靠的一点是,您希望事件处理内容具有良好的重试、回滚和幂等性(或事务性)。

如果您在 .NET 上运行,一些支持这种可靠性的基础架构示例包括 NServiceBusMassTransit .完全披露 - 我是 NServiceBus 的创始人。

更新:以下是关于忠诚度积分问题的评论:“如果延迟处理余额更新,客户实际上可能能够订购比他们拥有的积分更多的商品”。

许多人都在为这些强一致性的要求而苦苦挣扎。问题是,这类情况通常可以通过引入额外的规则来处理,比如如果用户最终的忠诚度积分为负数,请通知他们。如果 T 过去了而忠诚度积分没有被整理出来,则通知用户他们将根据某个转换率向 M 收费。当客户使用积分购买东西时,他们应该看到此政策。

关于database - 数据库与微服务的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com