Azure存储队列 - 需要很长时间才能处理

时间:2015-03-05 08:52:37

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

我需要生成大量报告,报告可能需要大约5分钟才能生成,大量数据,许多不同来源。

客户端会将消息发布到Azure存储队列。有一个工作者角色可以处理消息并生成报告。

如果我想扩大规模,请说我最终会有10个工作人员角色来处理来自队列的消息并生成报告。然后我会将消息添加到队列中,如下所示:

  • 消息1:处理报告从1 - 5
  • 消息2:过程报告从6到11 ........
  • 消息10:处理报告从50到55(范围可能不准确)

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

如何避免消耗队列消息,只记得任务很长?

1 个答案:

答案 0 :(得分:1)

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

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

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