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

问题描述 投票:0回答:1

使用

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);
}
azure azureservicebus transactionscope
1个回答
2
投票

批处理是一种在不超过总大小限制的情况下向代理发送多条消息的方法,因为在批处理构建期间,API 不会添加会导致批处理大小超过允许的最大值的消息。这就是批处理的目的,为了安全以确保您在发送时不会收到消息大小异常。

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

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

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

事务作用域的好处是,当您需要发送消息但在同一实例中没有所有消息可用,或者需要以即发即弃模式发送但仍希望确保以原子方式发送这些消息时。

© www.soinside.com 2019 - 2024. All rights reserved.