确保不同 .NET Core 服务之间的原子性

Ensuring atomicity between different .NET Core services

由于 .NET Core 尚不支持分布式事务 (https://github.com/dotnet/runtime/issues/715),我正在尝试寻找一种方法来确保我的应用程序中的一个流程的原子性。

流程如下:

这里可能出错的是 A 的过程可以,例如在将响应存储到其数据库之前被杀死,这将导致数据存储在 B 而不是 A,这是我想避免的事情。

我想不出一个非常简单的方法来解决这个问题。我最好的选择可能是在 'A' 中引入一些额外的清理逻辑,但我想知道是否有更简单、更智能的方法来做到这一点。

您可以使用具有保证交付的异步进程。 IE A 向 B 发送保证交付请求。B 执行一些操作并向 A 发送保证交付响应。这可以通过消息系统(Azure 服务总线、RabbitMQ 等)实现,或者简单地使用每个应用程序的本地数据库作为消息的出站队列。所以 A 不直接向 B 发送请求,A 将请求保存在其数据库中,一些后台进程 最终 调用 B。然后 B 对响应执行相同的操作。

您也可以使用“协调的”数据库事务来做到这一点。 IE A 启动事务 T1 并写入 B 的数据库。 A 启动第二个事务 T2 并将响应写入 A 的数据库。如果两次写入都成功,A 记录来自 B 的响应,快速连续地提交 T1 和 T2。如果 T1 提交而 T2 失败,A 记录失败并需要操作干预。

分布式事务本质上就是这样工作的。即使是“真正的”分布式事务,其中一个参与者也有可能无法提交。