当前位置: 首页 > 知识库问答 >
问题:

微服务架构中的分布式事务,如何处理超时和失败提交

邓仲卿
2023-03-14

假设您有一个服务a,它是大型微服务体系结构的一部分,在这个体系结构中,这些服务通过REST API或涉及某个代理的消息传递(RabbitMQ)相互通信。服务A公开RESTendpoint,该endpoint需要与某个第三方服务进行通信(与不在我们体系结构中的服务进行通信)并在那里创建一些内容,当服务A收到第三方的响应,表示那里一切正常时,它应该将该响应中的一些数据保存在自己的数据库中。

考虑到第三方不提供任何幂等机制,覆盖以下问题的最佳方式是什么。

>

  • 第三方端的创建正常,但在服务A中DB write失败。这将导致不一致的状态,您在第三方端创建了一些内容,但您自己的数据库中不需要关于它的数据。

    你收到了来自第三方的超时,所以你不能只是重复呼叫,因为他们没有提供任何幂等性机制。如果重复调用,可能会以两个(或更多)创建的资源而不是一个结束。

    问题1。可以通过任何重试机制来解决,该机制可以重试DB调用任意次数。这种方法的问题在于,如果正在重复DB调用的服务实例突然停止。

    据推测,更好的方法是服务在第三方成功创建后,发布一条关于成功创建的RabbitMQ消息。此服务将监听该消息,并在收到消息时执行DB调用。利用良好的重试机制和ACKing消息,可以解决服务实例突然关闭怎么办的问题。因此,在这个解决方案中,服务是自己消息的发布者和消费者。还有更好的主意吗?这个解决方案还将引入最终一致性,因为API调用者(调用服务Aendpoint的人)将在第三方成功创建后立即收到响应,但在服务数据库中保留任何内容之前(API客户端实际上需要什么)

    超时问题呢?在这种情况下,如何处理来自第三方的超时?。我认为没有什么比发出GET调用来检查他们是否创建了一些东西更好的了。同样,GET调用可能会失败,但它可以重复,直到成功。这里还有一个边际用例,即若服务在发出GET调用时停止,该怎么办。


  • 共有1个答案

    汝飞
    2023-03-14

    正确设置容错并不容易。我记得他们在Netflix堆栈中实现了一个专用模块:hystrix。也许这对你有帮助。

     类似资料:
    • 我有两个微服务和调用来更新数据,然后插入另一个数据,但让我们考虑一下 失败,然后我们需要回滚由 更新的数据,否则我们将处于不一致的状态。 我也经历了佐贺patterns.will它满足了这种矛盾 谁能为此提出更好的解决方案?

    • 我读了一些文章,看了一些视频,但在为这些微服务提供服务方面,没有找到具体的建议。我的理解是,他们应该使用自己的应用程序服务器。 我的问题是它们应该部署在不同的服务器上,还是没关系。 当它们在同一台服务器(计算机)上提供服务时,不会有端口冲突吗?

    • 最近在学微服务的分布式事务,不太明白为什么在微服务这种分布式系统中,原有的单体acid会出现问题 希望大佬们可以讲一下原理和思想

    • 我知道最好使用 Saga 模式,但想想还是很有趣的: < Li > 2PC/XA分布式事务是否提供了仅从一个应用程序和一个TM与多个RM进行事务的可能性? < li >如果没有-如果每个微服务只能访问自己的数据库,如何在多个微服务之间使用2PC/XA分布式事务来提供使用2PC的能力?我很乐意看到一个例子 < li >我们是否需要将TransactionManager服务作为一个独立的微服务,在多个

    • 我现在读了很多关于微服务的书,但仍然不了解其中的一些部分。我画了以下图: 每个微服务有2个访问: REST:对于超文本传输协议使用 gRPC:用于内部/后台通信/交换 如果我想登录,我可以向我的身份验证服务发送一个Http请求。但是,如果我想访问需要您连接的Stuff服务,该怎么办? 假设用户希望显示数据库中可用的内容,服务人员将首先通过与身份验证服务交换来检查连接用户的“令牌”是否正确,然后返回

    • 让我们讨论一下微服务环境的体系结构。我们正在公司内部进行讨论,我想得到一些反馈。我认真考虑的是编排层(代码复制、更多移动部件改变api)。 网络应用- 原料药- 在这种情况下,服务不允许相互对话。业务流程层中的聚合服务 网络应用- 原料药- 这里允许服务相互对话,这里存在聚合服务。 账单属于哪里