我的问题在原理上是:
如果服务B成功响应(并保存了数据),初始transaction;
>G 211,则提交事务
问题是服务B反应缓慢,服务A捕获超时异常并回滚事务。不过,服务B处理了数据(尽管它没有及时作出答复)。如果服务A和服务B都保存和处理了数据,则该进程将被视为成功。在这种情况下,由于事务回滚,服务A的数据没有保存。
这个问题有什么普遍的解决办法吗?我关注2PC和基于事件的分布式事务机制(如saga模式)。寻求任何帮助/链接/等等。
发布于 2021-09-30 20:37:38
我通常通过将对Service的调用划分为“准备”和“提交”阶段来解决这个问题。这实际上是为服务层放置2PC,在“挂起”状态中插入记录,然后进行最后的调用来“激活”更改。
事实是,HTTP之上的REST对于事务的一致性并不是很好。在讨论潜在的长期运行过程时,使用最终的一致性模型要好得多。在Service之后放置一个消息队列,将更新排队起来,并让Service轮询完成(或者有一个回调)。
https://stackoverflow.com/questions/69377436
复制相似问题