使用QueueClient消息泵扩展处理许多长时间运行的Azure Service Bus消息的Worker角色的最佳方法是什么。
如果使用QueueClient.OnMessageOptions.MaxConcurrentCalls = 6和QueueClient.OnMessage 这是否意味着我一次最多只能处理6条消息?
在OnMessage回调中使用长时间运行的处理来生成一个新任务来完成它的处理是不是很糟糕?
我应该使用QueueClient.OnMessageAsync吗?
感谢您的帮助。
答案 0 :(得分:3)
“长时间运行”是指IO绑定还是CPU绑定?
假设IO绑定,那么我不会在OnMessage回调中产生新的Task。这会产生线程管理开销,从而导致大规模处理速度变慢。
如果您正在使用IO绑定操作,请考虑使用 OnMessageAsync ,并确保等待任何这些操作的异步实现。这样可以更有效地使用现有线程。
如果您的操作受CPU约束,那么任务创建可能会为您做更多事情。 Stephen Cleary在一系列精彩文章中讨论了这方面的机制:
http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html
MaxConcurrentCalls 属性控制对服务总线的并发请求数。如果您受IO限制且受可用带宽限制,则增加此数量的影响有限。我建议使用Azure客户端性能计数器进行一些性能测试,以便为您的环境获得最佳价值。