我需要生成相当多的报告,生成一个报告大约需要 5 分钟,数据量很大,来源很多。
客户端将消息发布到 Azure 存储队列。有一个辅助角色处理消息并生成报告。
如果我想扩大规模,假设我最终有 10 个工作角色,它们将处理队列中的消息并生成报告。然后我将像这样将消息添加到队列中:
- 消息 1:处理 1 - 5 的报告
- 消息 2:处理 6 点至 11 点的报告 ........
- 消息 10:处理 50 - 55 之间的报告(范围可能不准确)
如果我的辅助角色 1 将获取第一条消息并对其加锁,但该过程需要 5 分钟,则锁将过期,并且该消息将在队列中再次可见,因此辅助角色 2 将获取该消息并开始处理它......等等
如何避免只消耗一次队列消息,同时记住任务很长?
最佳答案
首先:使用 Azure 存储队列,您应该为所有操作都幂等做好准备:如果您的队列项被处理多次,则每次都会发生相同的结果。我提出这一点的原因是:由于意外事件,例如您的角色实例崩溃/重新启动或您的队列项处理代码执行意外操作(例如引发异常)。
下一步:可以通过编程方式延长队列消息不可见超时。这可以通过队列 API 或通过语言 sdk 之一来完成。在 C# 中(类似这样 - 我没有测试这一点),再延长一分钟:
queueMessage.UpdateMessage(message,
TimeSpan.FromSeconds(60),
MessageUpdateFields.Visibility);
您还可以在此过程中修改消息(也许作为对代码的提示,让您知道 5 个报告中的哪一个已完成。这应该有助于您解决特定问题:如果消息被重新处理,您可以如果消息已修改为“处理来自 3-5 的报告
”之类的内容,则不必处理所有五个报告。注意:您可以通过 |
组合 MessageUpdateFields
标志:
queueMessage.UpdateMessage(message,
TimeSpan.FromSeconds(0),
MessageUpdateFields.Content);
最后:如果您关心处理一批报告所需的时间长度,也许可以重新考虑一下为什么要在每条消息中处理五个报告,而不是每条消息处理一个报告。您始终可以批量读取队列消息。 这有点主观,因为实际上没有正确或错误的方法,但这只是您需要思考的事情。
关于Azure存储队列-处理时间长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28873578/