【问题标题】:Why we need patterns like 2PC or SAGA to perform sequential transactions between microservices?为什么我们需要像 2PC 或 SAGA 这样的模式来执行微服务之间的顺序事务?
【发布时间】:2021-07-01 01:04:32
【问题描述】:

我遇到的问题是为什么我们甚至需要像 SAGA(异步)或 2PC(同步)这样的模式来执行微服务之间的事务性服务间通信? .因为我们可以通过命名服务器来实现。我的意思是让我们考虑一下,如果一个微服务在事务调用过程中出现故障,那么命名服务器不能将该请求路由到所需的不同微服务实例吗?那么微服务之间就不会有任何不可用的情况了。

例如:A 和 B 是微服务,所有这些微服务都注册在像 Eureka 这样的命名服务器中,A 需要 B 通过执行服务间通信来完成事务。但出乎意料的是,B 宕机了。因此,命名服务器可以将 A 的请求路由到 B 的另一个实例 no 。那么,不可用在哪里。那么现在为什么我们需要这些模式呢?

【问题讨论】:

    标签: architecture microservices saga


    【解决方案1】:

    这不是高可用性的问题,而是数据一致性的问题,这与我们在关系数据库中需要事务的原因相同。之所以需要它们,不仅是因为在事务期间数据库连接可能会失败,还因为我们希望整个操作要么成功要么失败。 这可能包括插入或更新期间未满足的约束等问题。

    这个问题也可以应用于分布式事务。您可能希望不同微服务中的两个操作成功或失败。如果其中一个操作失败,因为该微服务的实例已关闭,还因为数据库中的插入/更新由于任何其他原因而失败,您希望恢复整个操作,即使另一个调用已成功并且更改已提交。

    因此,您需要像 saga 模式这样的工具来实现补偿操作,以便在发生此类事情时恢复更改

    【讨论】:

    • SAGA 或 2PC 解决什么样的问题,而不是解决提供高可用性的问题。
    • 正如我之前所说,它们提供的数据一致性比高可用性更重要。他们确保完成所有操作或不执行任何操作。与传统RDBMS中的事务相同,它们不提供高可用性,但在进行多次更改时提供数据一致性
    • @JAgrente 不能用传统方法实现。我的意思是我已经提到我们可以拥有一个命名服务器,通过自动路由到可用实例来提供高可用性。所以我们不能根据http响应回滚事务吗?例如:在微服务 B 失败时,它将向 A 提供响应状态为 500。
    • @JAgrenete 我想根据你的建议遵循 SAGA 会更容易,而不是像我建议的那样遵循传统方法。我说的对吗?
    • 但是你不能回滚已经在服务 A 中提交的事务,因为服务 B 上存在错误,你可以做的唯一方法来恢复服务 A 中的提交是定义补偿saga 模式提供的动作或其他机制
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2020-10-01
    • 2020-05-29
    • 2010-11-24
    • 2011-09-29
    相关资源
    最近更新 更多