Ell*_*iot 4 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();
}
Run Code Online (Sandbox Code Playgroud)
运行时,我发现我的批次通常需要时间“预热”,检索诸如“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,这意味着不会从服务中提取任何其他消息。
当批量检索似乎一次检索的消息数量差异很大时,我真的不明白如何确定接收者的“每秒消息数”。任何帮助将不胜感激。
当批量检索似乎一次检索的消息数量差异很大时,我真的不明白如何确定接收者的“每秒消息数”。
在使用 OnMessage API 的场景中,预取更有意义。在这种情况下,会注册一个回调,该回调接受一条消息进行处理,您可以估计该消息的平均处理时间。OnMessage API 允许定义将运行多少并发回调。如果知道有源源不断的传入消息流,那么逐一检索消息的效率将极其低下。因此,PrefetchCount用于指定客户端应在后台“批量”检索多少条消息,以将往返保存回服务器。
| 归档时间: |
|
| 查看次数: |
6006 次 |
| 最近记录: |