多个Azure工作者角色轮询相同的队列导致死锁或毒药消息

时间:2011-08-28 08:20:26

标签: azure azure-storage azure-worker-roles azure-storage-queues

情景:

如果我分离出多个线程的多个辅助角色或一个辅助角色,它会轮询Azure队列中的新消息。

有人可以确认这是否是正确的设计方法?我想拥有许多工作者角色的原因是为了加速PROCESSJOB。我们的应用程序应该接近实时,即只要有消息我们应该得到,应用复杂的业务规则并提交到AZURE DB。我们期待每3分钟收到11,000条消息。

谢谢。

1 个答案:

答案 0 :(得分:17)

您可以拥有任意数量的队列阅读器。扩展工作者角色实例是很常见的,因为它们都可以从同一队列中读取,从而为您提供更高的工作吞吐量。

当您读取队列消息时,它会在一段时间内被标记为“不可见”,以防止其他人阅读和执行相同的工作。消息的所有者必须在时间段到期之前将其删除,否则消息将再次可见,并且当原始阅读器尝试删除消息时将抛出异常。这意味着您的操作必须是幂等的。

没有直接的毒药消息处理,但它很容易实现,因为每条消息都有一个出队计数。只需检查一遍,并在阅读3-4次后删除有毒信息。您还可以根据出队计数动态调整超时时间,因为由于时间窗口太短,处理可能会失败。

以下是DequeueCount的{​​{3}}。

编辑:至少在3分钟内处理11,000条消息:队列的可扩展性目标是 500 2,000 TPS,或者3分钟内最多360,000个事务(远远超出您的11,000条消息要求) 。通过将消息组合到单个队列消息中,以及一次读取多个消息,您可以进一步加快速度,这也将减少您的事务计数。您还可以查看队列的MSDN documentation属性,以查看您的队列是否正在备份(然后扩展到其他实例以帮助使用队列项)。