Jos*_*osh 5 c# azure azureservicebus
我正在尝试使用Azure Service Bus提高Windows服务的吞吐量.我注意到的是,如果我有像这样的代码.
client.OnMessageAsync(async message =>
{
var timer = new Stopwatch();
timer.Start();
bool shouldAbandon = false;
try
{
// asynchronouse processing of messages
await messageProcessor.ProcessAsync(message);
Interlocked.Increment(ref SimpleCounter);
// complete if successful processing
await message.CompleteAsync();
}
catch (Exception ex)
{
shouldAbandon = true;
Console.WriteLine(ex);
}
if (shouldAbandon)
{
await message.AbandonAsync();
}
timer.Stop();
messageTimes.Add(timer.ElapsedMilliseconds);
},
options);
Run Code Online (Sandbox Code Playgroud)
选项在哪里
OnMessageOptions options = new OnMessageOptions
{
MaxConcurrentCalls = maxConcurrent,
AutoComplete = false
};
Run Code Online (Sandbox Code Playgroud)
增加MaxConcurrentCalls在一定数量之后几乎没有影响(12-16通常用于我正在做的事情).
但是,使用相同的MaxConcurrentCalls创建多个客户端(QueueClient)确实可以提高性能(几乎是线性的).
所以我一直在做的是使#queueclient和maxconcurrentcalls可配置,但我想知道是否有多个队列客户端是最好的方法.
所以我的问题是:是否有多个队列客户端的消息泵为Windows服务和天蓝色服务总线运行不良或良好的做法?
我知道这现在已经很老了 - 但我想我应该贡献自己的发现。
我发现仅通过在同一台计算机上运行多个进程即可提高队列处理性能。就我而言,我使用的是控制台应用程序,但原理是相同的。
我认为最终这是因为该MaxConcurrency值最终控制服务总线将向消费客户端传递多少消息 - 当它达到该限制时,它会有效地进入睡眠状态一段时间(根据我的经验,大约 1 秒),然后再尝试向下推送更多消息。
因此,如果您有一个非常简单的消息处理程序,即使您将MaxConcurrency逻辑核心数设置为 2x/3x/4x,您也不太可能达到容量,但如果您推送的消息多于实际数量,处理多条消息仍然会非常慢。客户端配置为立即处理。使用相同的进程运行另一个进程MaxConcurrency可以为您提供两倍的可用容量 - 即使在同一台机器上 - 但它实际上并没有提供更多的功率。
最终,正确的配置将取决于队列任务的处理器使用情况。如果它们长时间运行并且往往会消耗处理器周期,那么太大MaxConcurrency可能会减慢您的速度,而不是加快速度 - 并且扩展到其他机器确实是唯一的解决方案。
但是,如果您的队列任务是“稀疏”的并且大部分时间都在等待,那么您将能够获得比MaxConcurrency处理器中逻辑核心更高的逻辑核心 - 因为它们不会一直都很忙。