Azure服务总线读取性能

我正在尝试使用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); 

选项在哪里

 OnMessageOptions options = new OnMessageOptions { MaxConcurrentCalls = maxConcurrent, AutoComplete = false }; 

增加MaxConcurrentCalls在一定数量之后几乎没有影响(12-16通常用于我正在做的事情)。

但是,使用相同的MaxConcurrentCalls创建多个客户端(QueueClient)确实可以提高性能(几乎是线性的)。

所以我一直在做的是使#queueclient和maxconcurrentcalls可配置,但我想知道是否有多个队列客户端是最好的方法。

所以我的问题是:是否有多个队列客户端的消息泵为Windows服务和azure色服务总线运行不良或良好的做法?

我知道现在已经很老了 – 但我想我会贡献自己的发现。

我只是通过在同一台机器上运行多个进程来看到队列处理性能的提高。 就我而言,我正在使用控制台应用程序,但原理是相同的。

我认为最终是因为MaxConcurrency值最终控制了服务总线传递给消费客户端的消息数量 – 当它达到该限制时,它会在尝试之前有效地进入hibernate一段时间(在我的经验中大约1秒)推送更多的消息。

因此,如果你有一个非常简单的消息处理程序,即使你将MaxConcurrency设置为逻辑核心数的2x / 3x / 4x,你也极不可能达到容量,但是如果你推送的消息数量多于处理多个消息仍然会非常慢客户端配置为立即处理。 使用相同的MaxConcurrency运行另一个进程会为您提供两倍的可用容量 – 即使在同一台计算机上 – 但它实际上并没有提供更多function。

最终,正确的配置将取决于队列任务的处理器使用情况。 如果它们长时间运行并且倾向于通过处理器周期进行咀嚼,那么拥有太大的MaxConcurrency可能会让您失望,而不是向上 – 并且扩展到其他机器确实是唯一的解决方案。

但是,如果您的队列任务“稀疏”并且大部分时间都在等待,那么您将能够获得比处理器中的逻辑核心更高的MaxConcurrency – 因为它们不会全部忙于所有时间。