执行多个Azure工作人员角色轮询同一队列导致死锁或中毒消息



场景:

如果我已经剥离了多个Worker角色或一个具有多个线程的Worker角色,这将轮询Azure队列中的新消息。

有人能确认一下这是否是正确的设计方法吗?我希望拥有许多工作者角色的原因是为了加快PROCESSJOB的速度。我们的应用程序应该接近实时,也就是说,只要我们收到消息,就应用复杂的业务规则并提交给AZURE DB。我们预计每3分钟发送11000条信息。

谢谢。

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

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

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

这是DequeueCount的MSDN文档。

编辑:就在3分钟内处理11000条消息而言:队列的可扩展性目标是5002000 TPS,或在3分钟内达360000个事务(远远超过11000条消息的要求(。您可以通过将消息合并为一条队列消息,以及一次读取多条消息来进一步加快速度,这也将减少您的事务计数。您还可以查看队列的ApprovimateMessageCount属性,以查看您的队列是否正在备份(然后扩展到其他整数以帮助使用队列项(。

最新更新