使用 ServiceBusMessageBatch 和在 TransactionScope 中发送多条消息有什么区别?

What is the difference between using a ServiceBusMessageBatch and sending multiple messages in a TransactionScope?

使用 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);
}

批处理是一种向代理发送多条消息的方式 w/o,因为在批处理构建期间,API 不会添加会导致批处理大小超过总大小限制的消息超过允许的最大值。这就是批处理的目的,为了确保您在发送时不会出现消息大小异常的安全性。

TransactionScope 确保在同一事务中发送的消息在成功时全部发送,或者在其中一条消息失败时还原。

对于批处理,这是对代理的一次调用。有多个并发调用具有事务作用域的broker,例如发送操作的数量。

批处理的好处:对代理的单个调用不会因为组合在一起的消息过多且超过最大大小而失败。当您有多条消息准备发送时,这很方便。

事务作用域的好处是,当您需要发送消息但在同一实例中并非所有消息都可用,或者需要以 fire-and-forget 模式发送但仍希望确保发送这些消息时原子地。