我有一个队列处理器,它从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 ......等数量的计数;批量检索号突然跳得高得多。
当使用60秒的默认锁定到期时,SubscriptionClient.PrefetchCount的良好值是工厂所有接收器的最大处理速率的20倍。例如,工厂创建3个接收器,每个接收器每秒最多可处理10个消息。预取计数不应超过20 X 3 X 10 = 600.默认情况下,QueueClient.PrefetchCount设置为0,这意味着不会从服务中提取其他消息。
我真的不明白如何确定每秒接收者的消息"当批量检索似乎一次检索到大量不同的消息时。非常感谢任何帮助。
答案 0 :(得分:2)
我真的不明白如何确定每秒接收者的消息"当批量检索似乎一次检索到大量不同的消息时。
在使用OnMessage API的情况下,预取更有意义。在该场景中,注册了一个回调,该回调接收单个消息进行处理,您可以估计该消息的平均处理时间。 OnMessage API允许定义将运行的并发回调数。知道有持续的传入消息流,逐个检索消息是非常有效的。因此,PrefetchCount
用于指定应该在"批次"中检索多少个mesasges。由后台客户端将往返保存回服务器。