【发布时间】:2021-07-10 04:58:33
【问题描述】:
互联网上有大量关于 2 阶段提交的文章。 他们都在说同样的话,我不明白。我需要对它有一个低层次的了解。
订单和支付服务示例是互联网上最流行的示例。
假设我们有订单服务和付款服务。下订单后,Order 服务将其写入其数据库,但支付服务也必须将其写入自己的数据库才能完成交易。
这是我的理解不足:
-
用户向 Orchestrator 发送下订单请求
-
Orchestrator 同时调用 Orders 服务和 Payment 服务。现在根据我所阅读的内容,订单和支付服务应该通过告诉它是否准备好来响应 Orchestrator。 这是什么意思?在这里做好准备是什么意思?
-
订单和支付服务做出响应,告诉 Orchestrator 他们已经“准备就绪”(不管是什么意思)。
-
Orchestrator 向这两个服务发送另一个请求(提交请求)。
-
Order 将记录写入其数据库。支付服务将记录写入自己的数据库。它们都以状态 200 响应 Orchestrator。
-
Orchestrator 检查两个参与者是否都返回了状态代码 200。如果是,则它什么也不做。如果不是,那么它会要求他们中止? 怎么样?其中一位参与者已经将交易写入其数据库。
【问题讨论】:
-
你的理解有缺陷;没有任何事情发生的第一步,只有第二步是不可逆转的。第一步包括参与者试探性地执行请求并报告“我做到了”,第二步是协调者根据是否每个人都做了“完成”或“回滚”命令。是的,事务必须能够在发出最终“提交”信号之前的任何时间中止(回滚);这可以通过多种方式实现。 WP 有一个decent article。
-
请注意,数据库(至少是关系型数据库,还有大多数其他类型的数据库)已经自己实现了事务。对于一个服务,它的实现变得微不足道:它所要做的就是启动一个数据库事务,执行请求,返回报告,然后按照指示回滚或提交它。如何实现回滚不需要关心它;那是数据库的问题。 (通常,数据库将原始数据的副本与事务一起存储在日志中,因此回滚包括写回该副本。)
-
@JeroenMostert 第一步“用户向 Orchestrator 发送下订单请求”是用户单击 UI 上的按钮。我知道这不是 2pc 的一部分。当您说第一步由参与者试探性地执行请求并报告“我做到了”时,您是什么意思。第一步如何?第一步不是编排器向参与者发送请求吗?
-
是的,但是请求也会立即执行(带有回滚选项)。除了 Wikipedia 文章之外,我不确定您在寻找什么,我认为这很好地解释了它。基本上,编排器要求每个人做他们应该做的事情并报告成功或失败,然后当所有节点都报告回来时,它会要求所有节点根据集体结果继续提交或回滚(如果全部提交,则提交)节点报告成功,如果至少有一个报告失败则回滚)。
-
@JeroenMostert 我在互联网上找到的维基百科或任何其他文章都非常抽象。当然,根据定义,模式是抽象的。但是我需要诸如以下的详细信息:如果对于库存管理项目,您有 5 个微服务。这是否意味着如果需要,他们都可以在某个时候成为协调员服务?还是必须是其他服务(第 6 项服务),其作用是协调库存项目中的所有事务?如果编排器本身失败了怎么办?
标签: sql .net algorithm design-patterns microservices