繁体   English   中英

保证不同.NET核心服务之间的原子性

[英]Ensuring atomicity between different .NET Core services

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

流程如下:

  • A 向 B 发送请求。
  • B 处理请求并将其存储在其数据库中。
  • B 返回响应,表示请求已成功处理。
  • A 将来自 B 的响应存储在其数据库中。

go 的错误之处在于 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 记录失败并且需要操作干预。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM