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

2023-12-24

I read some information about 2 Phase Commit/ XA distributed transactions and how JTA does support it. Seems to be that there is many resource managers - RM (eg. RDBMS or JMS), and one TransactionManager (TM) instance that manages global transactions across many RM's. TM <-> RM communication

我知道最好使用佐贺图案,但想想还是很有趣的:

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

UPD: 在JTA的世界里 TransactionManager 不提供REST API用于管理跨微服务的事务。 LIXA 提供了这种能力。带有示例的文章 https://dzone.com/articles/microservices-and-distributed-transactions除了答案:)


在微服务中,事务需要通过公开准备和提交 API 来完成。还需要有一个事务管理器来协调事务。

例如,假设有 2 个不同的银行,并且必须将 Bank1 的 Account_A 中的 100 美元转入 Bank2 的 Account_B。此外,假设中央银行当局负责交易完成 2PC 的工作方式如下:

  1. 中央银行机构(交易经理)将收到从 Bank1 的 Account_A 向 Bank2 的 Account_B 转账 100 美元的请求。

    a. https://CentralBank/Transaction?from=Bank1-Account_A&to=Bank2-Account_B&amount=100
    
  2. 中央银行会将其保存到其交易数据库中,其中交易 ID = 123。此外,它还会返回交易 ID 进行调用,以便稍后可以调用以获取交易状态。

    a. add transaction 123 in database with status open
    
  3. 准备阶段事务管理器将发出以下 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
    
  4. 提交阶段一旦它在准备阶段获得两个调用的成功响应,就会进入提交阶段,在此阶段发出以下命令:

    a. move transaction 123 to committed state
    b. https://Bank1/Commit?transactionid=123
    c. https://Bank2/Commit?transactionid=123
    
  5. 一旦在提交阶段的两个调用都获得成功响应,中央银行就可以将交易转移到“已完成”状态(可选)

  6. 如果 PREPARE 或 COMMIT 阶段的任何步骤失败,则事务协调器将通过发出以下命令来中止事务:

    a. move transaction 123 to Failed state
    b. https://Bank1/Rollback?transactionid=123
    c. https://Bank2/Rollback?transactionid=123
    

上述问题的形式为分布式原子提交,2PC 是一种实现方式。另请注意,2PC 有很多缺点,例如在 PREPARE 阶段央行崩溃后会发生什么。另外,如果 4.c 步骤失败但 4.b 成功,等等该怎么办。讨论这些本身就是非常广泛的研究,但仍然是需要注意的事情。尽管有很多缺点,2PC 因其简单性而被广泛使用。


我们是否需要使用 TransactionManager 服务作为单独的微服务来在许多微服务之间提供 2PC?

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨多个微服务的 2PC 分布式事务? 的相关文章

  • 带预览和进度栏的 Twitter Bootstrap 图像上传

    我如何使用 Twitter Bootstrap 上传带有预览和进度条的单个图像 目前 在保存图像之前 我看不到上传图像的任何预览或进度条 Jasny 的 Bootstrap 分支让您能够接近这一点 看文档 http jasny github
  • iOS:如何实现像Android的startActivityForResult这样的行为

    我是一名 Android 开发人员 正在开发我们应用程序的 iOS 版本 我需要知道如何在 Android 上实现类似于 startActivityForResult 的行为 我需要显示一个新的视图控制器 然后在新的视图控制器关闭时将控制权
  • AES 在 cryptojs 中加密并在 python Crypto.Cipher 中解密

    使用 js CryptoJS 加密并使用 python crypto Cipher 解密时出现问题 这是我在js中的实现 附加 iv 与加密消息并使用 base64 进行编码
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 使用 DataMapper 而不是 ActiveRecord [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • Adobe Illustrator 中的折线简化如何工作?

    我正在开发一个记录笔划的应用程序 您可以使用定点设备来绘制笔划 在上图中 我绘制了一个笔划 其中包含 453 个数据点 我的目标是大幅减少数据点的数量 同时仍然保持原始笔画的形状 对于那些感兴趣的人 上图笔画的坐标可以作为GitHub 上的
  • 扩展Android应用程序类

    当我正在寻找从远程设备获取错误报告的解决方案时 就像 iOS 中的试飞应用程序一样 我发现了acra适用于 Android 设备here http code google com p acra wiki BasicSetup 在基本设置中
  • 具有重复值的 Sqlite 列

    就说专栏吧aSQLite 数据库的非常重复 始终有相同的 4 个值 其他值可能稍后出现 但不同值的数量将少于 1000 个 VALUES hello world it s a shame to store this str many tim
  • Centos/Linux 将 logrotate 设置为所有日志的最大文件大小

    我们使用 logrotate 并且它每天运行 现在我们遇到了一些情况 日志显着增长 阅读 gigabaytes 并杀死我们的服务器 所以现在我们想为日志设置最大文件大小 我可以将其添加到 logrotate conf 中吗 size 50M
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen
  • 如何从我的 appDelegate 访问我的 viewController? iOS系统

    我有一个在 xCode 中创建为 基于视图的应用程序 的 iOS 应用程序 我只有一个 viewController 但它会自动显示 而且我没有看到任何将它与我的 appDelegate 关联的代码 我需要将数据从 appDelegate
  • .gitignore:如何忽略嵌套目录?

    我有以下目录结构 test a test b c test a b Ouput test c d e Output test f Output 我想忽略 test 下的所有 Output 目录 我试过test Output 但没有成功 我究
  • Pandas 2 个字段中唯一值的数量

    我正在尝试查找覆盖 2 个字段的唯一值的数量 例如 一个典型的例子是姓氏和名字 我有一个数据框 当我执行以下操作时 我只获取每列的唯一字段数 在本例中为 最后一个 和 第一个 不是复合体 df Last Name First Name nu
  • 如何从Python枚举类中获取所有值?

    我正在使用 Enum4 库创建一个枚举类 如下所示 class Color Enum RED 1 BLUE 2 我要打印 1 2 作为某处的列表 我怎样才能实现这个目标 您可以执行以下操作 e value for e in Color
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC
  • AngularJS 中的全局模拟对象用于 jasmine/karma 测试

    我有一个正在模拟进行单元测试的对象 基本上在我的测试文件中 我将其模拟如下 var mockObject mockMethod1 function return true mockMethod2 function return true b
  • 在着色器中旋转法线

    我有一个场景 其中有多个具有各自位置和旋转的模型 给定法线 着色器对每个像素应用简单的双向照明 那是我的顶点着色器 version 150 in vec3 position in vec3 normal in vec2 texcoord o
  • 在reactjs中停止超时?

    有没有办法可以杀死 摆脱 reactjs 中的超时 setTimeout function do something bind this 3000 通过某种点击或操作 我希望能够完全停止并结束超时 有没有办法做到这一点 谢谢 假设这种情况发
  • 使用 python/scipy 进行 voronoi 和 lloyd 松弛

    如何使用 Qhull 确定哪些 voronoi 单元 按索引 是 正确的 由 现有顶点 组成 我正在尝试使用 LLoyds 算法和 scipy spatial Voronoi 它是 Qhull 的包装器 生成的输入来执行约束松弛 就代码而言

随机推荐

  • 迁移出 AppEngine

    我有一个在 AppEngine 上运行的应用程序 每天使用大约 50 个 CPU 小时 大部分时间都花在等待数据存储上 我正在考虑将其从 AppEngine 移至 Rackspace 云服务器之类的地方 因为我认为如果我可以将部分工作卸载到
  • iOS - 如何检查模式视图是否存在

    有没有办法检查模式视图是否存在 我想仅在存在模式视图时运行方法 另外 如果我有多个模态视图 有没有办法检查是否存在某个模态视图 我使用以下代码来呈现和关闭模态视图 self presentModalViewController myModa
  • 如何从 QML 访问 C++ 枚举?

    class StyleClass public QObject public typedef enum STYLE RADIAL STYLE ENVELOPE STYLE FILLED Style Style m style h文件中有上述
  • 如何在 PHP 5.2.8 中比较两个 DateTime 对象?

    看了一下PHP文档 有以下两种方法DateTime对象似乎都可以解决我的问题 日期时间 差异 http au php net manual en datetime diff php 获取差异并使用它来确定哪个更古老 日期时间 获取时间戳 h
  • 用于导航到变量类的 Visual Studio 快捷方式

    Usually it is a simply as clicking on F12 on the declaration class type of a variable 然而 随着使用量的增加var关键字 我想知道 Visual Stud
  • 错误:为 h5py 构建轮子失败无法构建 h5py 错误:无法为 h5py 构建轮子,这是安装 pyproject.toml-basedprojects 所必需的

    当我运行以下命令来安装tensorflow时 出现此错误 python3 m pip install tensorflow macos ERROR Failed building wheel for h5py Failed to build
  • 小胡子模板不会在表 tbody 内呈现

    为什么相同的 JSON 对象代码会生成输出ul元素 但不带有table tag 我的小胡子模板如下 div h3 name h3 ul students li name age li students ul div div table th
  • PHP 在路径中包含变量

    因此 我们构建的网站必须从本地开发服务器移植到测试服务器 然后移植到实时服务器 为此我们创建了一个变量 当我们将网站从服务器移动到下一个服务器时 想法是简单地更改 path 定义以适应新的开发服务器 目前 当我们调用包含时 我们在每个页面上
  • 在 CSS 中使用相对大小而不是固定大小

    我想使用相对大小而不是固定大小 我想用它们 我的CSS是 body font 10px wrap font 1 2em wrap ul li padding left 2em 的价值是什么li的内边距以 px 为单位 我猜它是 2 0 10
  • Java Transformer 如何忽略名称空间

    我必须将 XML 转换为 XHTML 但 XML 定义了命名空间xmlns http www lotus com dxl 它从未在整个 XML 中使用过 因此解析器不会解析任何内容 有没有办法忽略命名空间 我正在使用 Oracle java
  • 使用 Web Api 验证 .NET MVC 应用程序

    我有一个基于 SPA VS 2013 模板的 Web Api 2 项目 我在该 Api 中配置了不记名令牌身份验证 我还有一个单独的 MVC 5 项目 我想使用该 Web Api 进行身份验证 那可能吗 如何 到目前为止我做了什么 在我的
  • Eclipse 中没有服务器;尝试安装 Tomcat

    我正在尝试在 Eclipse 中安装 Tomcat 但无法显示服务器选项卡 当我去窗口 gt 显示视图 gt 其他并输入 服务器 我没有得到任何结果 当我去文件 gt 新建 gt 其他并输入 服务器 我也什么也得不到 有谁知道我的服务器出了
  • 如何使用java api知道jenkins构建执行器是否空闲

    我想通过使用 java jenkins API 知道 jenkins 中的构建执行器是否空闲 空闲或任何作业正在主节点中运行 而我的要求是这样的 如果任何执行者有空 我必须触发詹金斯工作 否则我会等到他们可用 为此我必须使用 Jenkins
  • 使用nextjs和react-jss时className不匹配

    我将 nextjs 与 typescript 和 React jss 一起使用 我收到错误 Warning Prop className did not match Server mobileNavToggle 0 2 10 Client
  • 从客户端控制器指定 Mongo 查询参数 (MEAN.JS)

    我正在使用 MongoDB Angular Express 和 Node MEAN 堆栈 构建一个应用程序 我使用 MEAN JS 生成器来构建我的应用程序 我将使用文章模块作为参考 假设我的文章集合中有 7000 条记录 并且每条记录都有
  • 如何在 Android 中使用新的 Dialogflow SDK V2

    我对迁移到 Dialogflow V2 有点困惑 我有一个 Android 应用程序使用https github com dialogflow dialogflow android client https github com dialo
  • 交互式地处理占用大量内存的列表对象

    我最近发现了包裹的奇妙之处bigmemory ff and filehash处理非常大的矩阵 如何处理非常大 300MB 的列表 在我的工作中 我每天都在处理这些列表 我可以用创可贴解决方案save load 黑客无处不在 但我更喜欢big
  • 为什么在 Python 中 math.floor(x/y) != x // y 表示两个可整除的浮点数?

    我一直在阅读有关Python中的除法和整数除法以及Python2与Python3中的除法之间的差异 在大多数情况下 这一切都是有道理的 Python 2 仅当两个值都是整数时才使用整数除法 Python 3 始终执行真除法 Python 2
  • 动态 SVG 图像生成问题

    我正在尝试编写一个服务器端脚本 PHP 来根据用户输入生成 SVG 图像 我正在使用以下代码
  • 跨多个微服务的 2PC 分布式事务?

    I read some information about 2 Phase Commit XA distributed transactions and how JTA does support it Seems to be that th