gpt4 book ai didi

Azure 服务总线事务发件箱模式的替代方案

转载 作者:行者123 更新时间:2023-12-02 06:15:08 26 4
gpt4 key购买 nike

假设我有一个通用的传奇场景(给定三个不同的微服务 A、B 和 C,通过消息传递进行通信):

 1. Service A
a. Performs operation A successfully
b. Communicates update with message A
2. Service B (after receiving message A)
a. Performs operation B successfully
b. Communicates update with message B
3. Service C (after receiving message B)
a. Fails to perform operation B
b. Communicates failure
4. Service A and B performs compensating actions

据我了解,虽然整个工作流程应最终保持一致,但您希望确保本地操作(ab)在事务上保持一致,以避免丢失消息(或者如果相反,避免发送消息但无法持久保存操作更改)。

这是 transactional outbox pattern 遇到的问题如果我没记错的话,目的是解决问题。

在 Azure 上的 .NET 上下文中,使用

  • EF 核心
  • Azure 服务总线

有没有一种方法可以在不将消息保存到数据库的情况下获得相同级别的事务安全性(即不使用事务发件箱)?

我见过很多System.Transactions提到过,但它要么用于多个数据库操作,要么用于多个服务总线操作,而不是数据库和服务总线操作一起使用。

这样的事情可以实现所需的事务一致性吗?

using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
// _dbContext.Database.EnlistTransaction(ts); <-- ?
_dbContext.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
_dbContext.SaveChanges();
await _serviceBusSender.SendMessageAsync(new ServiceBusMessage());
ts.Complete();
}

最佳答案

不,您无法实现这一点,因为不同的资源无法参与单个事务,因为这将成为分布式事务,这在云环境中是不受欢迎的。

为了确保您的数据和消息传递操作共享同一事务,您需要考虑某种持久性,例如发件箱。

NServiceBus 等框架为发件箱提供支持,其中 Azure 服务总线作为传输,SQL Server 或文档数据库作为数据存储。

关于Azure 服务总线事务发件箱模式的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70580245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com