首页 文章

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

提问于
浏览
1

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

客户端将邮件发布到Azure存储队列 . 有一个辅助角色可以处理消息并生成报告 .

如果我想扩展它,那么假设我最终得到了10个工作者角色,这些角色将处理来自队列的消息并生成报告 . 然后我会将消息添加到队列中,如下所示:

  • 消息1:处理报告从1到5

  • 消息2:处理报告从6 - 11 ........

  • 消息10:处理报告从50 - 55(可能不准确的范围)

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

我怎样才能避免消耗队列消息只是一次完成,记住任务很长?

1 回答

  • 1

    首先:使用Azure存储队列,您应该为所有操作做好准备:如果您的队列项被多次处理,每次都会发生相同的结果 . 我提出这个问题的原因:有's simply no way to guarantee you' ll处理消息一次(除非您检查消息的 DequeueCount 属性并相应地停止处理),这是由于您的角色实例崩溃/重新启动或您的队列项处理代码执行等意外事件像抛出异常一样出乎意料的事 .

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

    最后:如果您在每条消息中处理五个报告,而不是每条消息一个报告 . 您始终可以批量读取队列消息 . 这有点主观,因为你需要考虑的事情 .

相关问题