Azure 存储队列 - 处理时间长

Azure Storage Queue - long time to process

我需要生成相当多的报告,生成一份报告可能需要大约 5 分钟,数据量很大,来源很多。

客户端将 post 消息发送到 Azure 存储队列。有一个处理消息并生成报告的辅助角色。

如果我想扩大规模,假设我最终有 10 个辅助角色,它们将处理队列中的消息并生成报告。然后我将像这样将消息添加到队列中:

如果我的工作者角色 1 将获取第一条消息并锁定它,但该过程将花费 5 分钟,锁定将过期并且消息将再次在队列中可见,因此工作者角色 2 将采取它并开始处理它......等等

记住任务很长,我怎样才能避免只使用一次队列消息?

首先:使用 Azure 存储队列,您应该为所有操作做好准备 幂等:如果您的队列项被处理多次,结果相同每次都应该发生。我提出这个问题的原因:根本没有办法保证你会处理一次消息(除非你检查消息的 DequeueCount 属性 并相应地停止处理),由于意外事件,例如作为你的角色实例 crashing/rebooting 或你的队列项目处理代码做一些意想不到的事情,比如抛出异常。

下一步:可以通过编程方式延长队列消息不可见超时。这可以通过队列 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);

最后:如果您担心处理一批报告所花费的时间长度,或许可以重新考虑为什么要在每封邮件中处理五份报告,而不是每封邮件处理一份报告。您始终可以批量读取队列消息。 这有点主观,因为确实没有正确或错误的方法,但这只是您需要考虑的事情。