java - 跨多个微服务的 2PC 分布式事务?

标签 java microservices distributed-system distributed-transactions 2phase-commit

我阅读了一些关于 2 Phase Commit/XA 分布式事务以及 JTA 如何支持它的信息。好像有很多资源管理器——RM(比如RDBMS或者JMS),还有一个交易管理器 (TM) 管理跨多个 RM 的全局事务的实例。
TM <-> RM communication
我知道最好使用 Saga 模式,但想想还是很有趣的:

  • 做 2PC/XA 分布式事务给可能性 仅通过一个应用程序和一个 TM 与多个 RM 进行交易 ?
  • 如果没有 - 如何使用 2PC/XA 多微服务间分布式事务提供使用 2PC 的能力,如果 每个微服务只能访问自己的数据库 ?我很高兴看到一个例子
  • 我们是否需要使用事务管理器 服务作为一个单独的微服务在许多微服务之间提供2PC?

  • 更新: 在JTA世界 TransactionManager 不提供 REST API 用于管理跨微服务的事务。 LIXA 提供了这种能力。 Article with examples除了答案:)

    最佳答案

    在微服务中,事务需要通过暴露 Prepare & Commit API 来完成。还需要有一个事务管理器来协调事务。
    例如,假设有 2 个不同的银行,Bank1 的 Account_A 中的 100 美元必须转移到 Bank2 的 Account_B。进一步假设中央银行当局负责完成交易
    2PC 的工作方式如下:

  • 中央银行机构(交易经理)将收到从 Bank1 的 Account_A 向 Bank2 的 Account_B 转账 100 美元的请求。
    a. https://CentralBank/Transaction?from=Bank1-Account_A&to=Bank2-Account_B&amount=100
    
  • 中央银行会将其保存到其交易数据库中,其中一些交易 ID = 123。它还会返回交易 ID 以进行调用,以便稍后它可以调用以获取交易状态。
    a. add transaction 123 in database with status open
    
  • 准备阶段 事务管理器将发出以下 RPC 命令:
    a. https://Bank1/Prepare?Account=Account_A&money=100&action=subtract&transactionid=123
    b. https://Bank2/Prepare?Account=Account_B&money=100&action=add&transactionid=123
    
  • 提交阶段 一旦它在准备阶段对两个调用都获得成功响应,它就会进入提交阶段,在那里它发出以下命令:
    a. move transaction 123 to committed state
    b. https://Bank1/Commit?transactionid=123
    c. https://Bank2/Commit?transactionid=123
    
  • 一旦在提交阶段对两个调用都获得成功响应,中央银行可以将交易移动到已完成状态(可选)
  • 如果 PREPARE 或 COMMIT 阶段的任何步骤失败,则事务协调器通过发出以下命令来中止事务:
    a. move transaction 123 to Failed state
    b. https://Bank1/Rollback?transactionid=123
    c. https://Bank2/Rollback?transactionid=123
    

  • 以上问题是的形式分布式原子提交 ,而 2PC 是一种方法。还要注意 2PC 有很多缺点,比如在准备阶段中央银行崩溃之后会怎样。另外,如果 4.c 步骤失败但 4.b 成功,等等。讨论这些本身就是一项非常广泛的研究,但仍然需要注意。尽管有很多缺点,2PC 由于其简单性而被广泛使用。

    Do we need to use TransactionManager service as a separate microservice to provide 2PC between many microservices?


    理论上不会。如果你仔细观察任何银行(Bank1 或 Bank2)也可以充当事务管理器(它只需要一个单独的数据库表事务),但实际上很多时候它是作为单独的微服务保存的。

    关于java - 跨多个微服务的 2PC 分布式事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65382918/

    相关文章:

    java - Eclipse创建runnable jar问题

    java - JPA、Spring Webservice 使用 NOT IN 和 IN 选择

    javascript - 将套接字客户端与 NestJs 微服务结合使用

    java - 如何配置 Lagom 框架以与 CORS 配合使用?

    java - 如何为具有动态大小的 ZooKeeper 集群初始化 CuratorFramework?

    java - 如何与 Java 中的 OData 交互?

    java - Docker 容器中的 Spring 模板

    ruby-on-rails - 无法使用Docker Compose将mongodb与Rails容器连接

    distributed-computing - Messenger 如何在聊天期间和用户再次登录时保持消息的顺序?

    java - 打印在网络论坛上发布大量问题和大量答案的前 10 位用户