Azure服务总线- Post到事务范围内的队列和主题



我有一个应用程序,有一个ServiceBusTrigger Azure功能。在此函数的处理程序中,在我的"QueueA"我需要做一些业务逻辑,最后,我必须这样做:

  • 发布消息到" topic ">
  • 发布另一种消息到我的" queue "将内容保存到数据库中,更新我的事件状态
  • 将文件从一个文件夹移动到文件共享存储中的另一个文件夹
  • 将收到的消息内容保存在"QueueA"到数据库

我需要在事务范围内做所有这些事情,因为如果一个项目失败,任何其他项目都不能继续。

我的cenário在没有第二项的情况下工作得很好,因此,在我试图发布到同一个事务中的主题和队列之后,我得到了这个错误消息:

本地事务不能跨越多个顶级实体,如队列或主题。

从微软的文档中我发现了这个:

服务总线支持针对SINGLE的分组操作事务范围内的消息传递实体(队列、主题、订阅)。例如,您可以在事务范围内向一个队列发送多个消息,并且只有在事务成功完成时,这些消息才会提交到队列的日志中。

我只是被困在这里,不知道我该怎么做,并保持线程安全。任何人通过它,可以帮助我发布到队列和事务范围内的主题?

TL;DR:您可以使用Azure服务总线使用跨实体事务API向多个目的地发送/发布最多100条消息。

事务处理、事务范围和Azure服务总线跨实体事务并不完全相同,尽管使用了"事务"这个词。

我需要在事务范围内做所有这些事情,因为如果一个项目失败,任何其他项目都不能继续。

在Azure中,没有这样的事务,它将跨越多个资源/服务并在失败时回滚。Azure服务总线有自己的它不会与Azure SQL数据库事务共享,因为DTC在Azure或任何云中都不可用。

你是做什么的?您将工作分解为独立的部分,如果成功,则发出消息以表示继续(向前移动到下一个任务)或回滚(补偿操作)。

我的cenário在没有第二项的情况下工作得很好,因此,在我试图发布到同一个事务中的主题和队列之后…任何人通过它,可以帮助我发布到一个队列和一个交易范围内的主题?

你所提到的文档,有一个代码片段正是这样做的:

var options = new ServiceBusClientOptions { EnableCrossEntityTransactions = true };
await using var client = new ServiceBusClient(connectionString, options);
ServiceBusReceiver receiverA = client.CreateReceiver("queueA");
ServiceBusSender senderB = client.CreateSender("queueB");
ServiceBusReceivedMessage receivedMessage = await receiverA.ReceiveMessageAsync();
using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
await receiverA.CompleteMessageAsync(receivedMessage);
await senderB.SendMessageAsync(new ServiceBusMessage());
ts.Complete();
}

不幸的是,这个例子没有提到有一个主题是不够的。在主题下订阅也是必要的。但这不是你的问题。验证发送和发布工作在没有任何其他作用域的情况下是隔离的,因为如果服务总线在事务中发现了其他内容,则服务总线将不起作用。这可能是错误信息误导。

最新更新