【问题标题】:Azure Storage Queue - long time to processAzure 存储队列 - 处理时间长
【发布时间】:2015-05-06 13:40:56
【问题描述】:
我需要生成相当多的报告,生成一份报告可能需要大约 5 分钟,大量数据,许多不同的来源。
客户端会将消息发布到 Azure 存储队列。有一个工作角色负责处理消息并生成报告。
如果我想扩大规模,假设我最终拥有 10 个工作角色,它们将处理来自队列的消息并生成报告。然后我会像这样将消息添加到队列中:
- 消息 1:处理 1 - 5 的报告
- 消息 2:处理 6 - 11 的报告
........
- 消息 10:处理 50 - 55 的报告(范围可能不准确)
如果我的工作角色 1 将获取第一条消息并对其进行锁定,但该过程需要 5 分钟,则锁定将过期并且消息将再次在队列中可见,因此工作角色 2 将接受它并开始处理它......等等
如何避免只使用一次队列消息,同时记住任务很长?
【问题讨论】:
标签:
azure
azure-storage
azure-worker-roles
azure-storage-queues
【解决方案1】:
首先:使用 Azure 存储队列,您应该为所有操作做好准备幂等:如果您的队列项被多次处理,则每次都应该发生相同的结果。我提出这个问题的原因:由于意外事件(例如角色实例崩溃/重新启动或您的队列项处理代码执行一些意外的操作,例如引发异常。
下一步:队列消息不可见超时可以通过编程方式进行扩展。这可以通过队列 api 或通过一种语言 sdk 来完成。在 c# 中(类似这样 - 我没有测试过),再延长一分钟:
queueMessage.UpdateMessage(message,
TimeSpan.FromSeconds(60),
MessageUpdateFields.Visibility);
您还可以在此过程中修改消息(可能作为对代码的提示,让您知道 5 个报告中的哪一个已完成。这应该有助于您解决具体问题:如果消息被重新处理,您如果消息已被修改为“process reports from 3-5”之类的内容,则不必处理所有五个报告。注意:您可以通过| 组合MessageUpdateFields 标志:
queueMessage.UpdateMessage(message,
TimeSpan.FromSeconds(0),
MessageUpdateFields.Content);
最后:如果您担心处理一批报告所花费的时间长度,不妨重新考虑一下为什么要在每封邮件中处理五份报告,而不是每封邮件一份报告。您始终可以批量读取队列消息。 这有点主观,因为确实没有正确或错误的方法,但这只是供您考虑的事情。