1

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

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

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

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

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

如何避免只使用一次队列消息,记住任务很长?

4

1 回答 1

1

首先:使用 Azure 存储队列,您应该准备好所有操作都是幂等的:如果您的队列项被多次处理,则每次都应该发生相同的结果。我提出这个问题的原因:根本无法保证您会处理一次消息(除非您检查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);

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

于 2015-03-05T12:14:32.690 回答