【问题标题】: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);
    

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

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2018-04-24
      • 2019-07-12
      • 1970-01-01
      相关资源
      最近更新 更多