0

我的问题是:

  1. 服务 A 开始交易;
  2. 服务 A 准备并将任何数据保存到 DB
  3. 服务 A 对服务 B 发出一些(HTTP-REST)请求
  4. 如果服务 B 成功响应(并保存数据),则 A 提交事务
  5. 如果服务 B 抛出任何异常 - 服务 A 回滚事务

问题是服务 B 只是响应缓慢,服务 A 捕获了超时异常并回滚了事务。然而,服务 B 处理了数据(尽管它没有及时响应)。何时,如果服务 A 和服务 B 都保存并处理了数据,则认为该过程成功。在这种情况下,由于事务的回滚,服务A的数据没有被保存。

这个问题有一个通用的解决方案吗?我期待 2PC 和基于事件的分布式事务机制(例如 saga 模式)。感谢任何帮助/链接/等。

4

1 回答 1

1

我通常通过将对服务 B 的调用拆分为“准备”和“提交”阶段来解决这个问题。这实际上是为服务层放置 2PC,插入处于“待处理”状态的记录,然后最终调用“激活”更改。

事实是,基于 HTTP 的 REST 对事务一致性不是很好。当您谈论潜在的长期运行流程时,您最好使用最终一致性模型。在服务 B 后面放置一个消息队列,将更新排队,并让服务 A 轮询完成(或进行回调)。

于 2021-09-30T20:37:38.470 回答