扩展长时间运行的消息处理 Azure 服务总线

Scaling Long Running Message Processing Azure Service Bus

使用 QueueClient 消息泵扩展正在处理许多长时间运行的 Azure 服务总线消息的辅助角色的最佳方法是什么。

如果使用 QueueClient.OnMessageOptions.MaxConcurrentCalls = 6 和 QueueClient.OnMessage 这是否意味着我一次最多只能处理 6 条消息?

在 OnMessage 回调中进行长时间运行的处理以生成新任务来完成它的处理是否是一种错误的形式?

我应该改用 QueueClient.OnMessageAsync 吗?

感谢您的帮助。

“long 运行”是指 IO 绑定还是 CPU 绑定?

假设受 IO 限制,那么我不会在 OnMessage 回调中生成新任务。这会产生线程管理开销,可能会大规模减慢处理速度。

如果您正在使用 IO 绑定操作,请考虑使用 OnMessageAsync,并确保等待任何这些操作的异步实现。这可以更有效地使用您现有的线程。

如果您的操作受 CPU 约束,那么任务创建可能会为您做更多的事情。 Stephen Cleary 在一系列优秀的帖子中讨论了这一机制:

http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html

MaxConcurrentCalls属性控制服务总线的并发请求数。如果您受 IO 限制并受可用带宽限制,则增加此数字的影响有限。我建议使用 Azure 客户端性能计数器进行一些性能测试,以获得适合您的环境的最佳值。