azure - 多个Azure辅助角色轮询同一队列是否会导致死锁或中毒消息

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

场景:

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

有人可以确认这是否是正确的设计方法吗?我希望拥有许多辅助角色的原因是为了加快 PROCESSJOB 的速度。我们的应用程序应该接近实时,即一旦有消息我们就应该收到,应用复杂的业务规则并提交到 AZURE DB。我们预计每 3 分钟有 11,000 条消息。

谢谢。

最佳答案

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

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

没有直接的有毒消息处理,但很容易实现,因为每条消息都有一个出队计数。只要检查一下,看3-4遍就可以删除有毒信息。您还可以根据出队计数动态调整超时时间,因为可能会因时间窗口太短而导致处理失败。

这是MSDN documentation对于DequeueCount

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

关于azure - 多个Azure辅助角色轮询同一队列是否会导致死锁或中毒消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219798/

相关文章:

json - Azure 表存储 JSON 返回每个条目的数组而不是单个数组

powershell - 为什么我在尝试创建 Active Directory 服务主体时收到 "Key credential start date is invalid."

javascript - 通过 javascript 上传票证上传到 Azure Blob

c# - TableServiceContext 不会序列化 ValueObjects

azure - Azure.Data.Tables 中的实体拦截器

azure - OnStart 与批处理文件的启动脚本?

Azure 缩放和自动缩放失败

azure - Ansible:如何在 `azure_rm_deployment` 模块中使用 Azure RM 模板?

azure - Azure Web 角色启动上的 PhantomJS Webserver exe

node.js - 删除 azure blob block 列表express/nodejs