如何确定Azure ServiceBus PrefetchCount和ReceiveBatch大小

时间:2018-02-08 20:57:47

标签: c# azure azureservicebus azure-servicebus-queues

我有一个队列处理器,它从ServiceBus队列中检索所有消息。我想知道如何确定MessageReceiver PrefetchCount和ReceiveBatch messageCount以优化性能。我目前将这些设置为任意数字500,如下所示:

var receiverFactory = MessagingFactory.CreateFromConnectionString("ConnectionString");
var receiver = await receiverFactory.CreateMessageReceiverAsync("QueueName", ReceiveMode.PeekLock);
receiver.PrefetchCount = 500;

bool loopBatch = true;
while (loopBatch) 
{
    var tempMessages = await receiver.ReceiveBatchAsync(500, TimeSpan.FromSeconds(1));
    // Do some message processing...
    loopBatch = tempMessages.Any();
}

跑步时,我看到我的批次经常需要时间来热身,"检索诸如" 1,1,1,1,1,1,1,1,125,125,125,125 ......等数量的计数;批量检索号突然跳得高得多。

来自Prefetching optimization文档:

  

当使用60秒的默认锁定到期时,SubscriptionClient.PrefetchCount的良好值是工厂所有接收器的最大处理速率的20倍。例如,工厂创建3个接收器,每个接收器每秒最多可处理10个消息。预取计数不应超过20 X 3 X 10 = 600.默认情况下,QueueClient.PrefetchCount设置为0,这意味着不会从服务中提取其他消息。

我真的不明白如何确定每秒接收者的消息"当批量检索似乎一次检索到大量不同的消息时。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

  

我真的不明白如何确定每秒接收者的消息"当批量检索似乎一次检索到大量不同的消息时。

在使用OnMessage API的情况下,预取更有意义。在该场景中,注册了一个回调,该回调接收单个消息进行处理,您可以估计该消息的平均处理时间。 OnMessage API允许定义将运行的并发回调数。知道有持续的传入消息流,逐个检索消息是非常有效的。因此,PrefetchCount用于指定应该在"批次"中检索多少个mesasges。由后台客户端将往返保存回服务器。