使用Azure.Messaging.ServiceBus
。
我想在一个事务中向Azure服务总线发送多条消息。我很好每个事务100条消息的限制。
这两种方法的优缺点是什么?
事务作用域
- TransactionScope中的多个单消息发送操作。*
public async Task SendMessages(IEnumerable<ServiceBusMessage> messages, CancellationToken cancellationToken)
{
using var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
var tasks = messages.Select(m => _serviceBusSender.SendMessageAsync(m, cancellationToken));
await Task.WhenAll(tasks);
transaction.Complete();
}
ServiceBusMessageBatch
- 单次发送操作,发送ServiceBusMessageBatch。*
public async Task SendMessages(IEnumerable<ServiceBusMessage> messages, CancellationToken cancellationToken)
{
var batch = await _serviceBusSender.CreateMessageBatchAsync(cancellationToken);
foreach (var message in messages)
{
if (!batch.TryAddMessage(message))
throw new Exception("...");
}
await _serviceBusSender.SendMessagesAsync(batch, cancellationToken);
}
1条答案
按热度按时间n3h0vuf21#
批处理是一种在不超过总大小限制的情况下向代理发送多个消息的方法,因为在批处理构造期间,API不会添加会导致批处理大小超过允许的最大值的消息。这就是批处理的目的,为了安全起见,确保您在分派时不会获得消息大小异常。
TransactionScope
确保在同一事务中发送的消息在成功时全部发送,或者在其中一个消息失败时恢复。对于批处理,它是对代理的单个调用。有多个对代理的并发调用,其范围为事务范围,例如发送操作的数量。
批处理的优点:对代理的单个调用,不会因为太多消息组合在一起并超过最大大小而失败。当您有多个消息准备发送时,这很方便。
事务作用域的好处是,当您需要分发消息,但在同一示例中没有所有可用的消息时,或者需要以“发射后忘记”模式发送,但仍希望确保这些消息以原子方式发送时。