Azure存储队列-处理时间长

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

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

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

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

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

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

如何避免只消耗一次队列消息,同时记住任务很长?

最佳答案

首先:使用 Azure 存储队列,您应该为所有操作都幂等做好准备:如果您的队列项被处理多次,则每次都会发生相同的结果。我提出这一点的原因是:由于意外事件,例如您的角色实例崩溃/重新启动或您的队列项处理代码执行意外操作(例如引发异常)。

下一步:可以通过编程方式延长队列消息不可见超时。这可以通过队列 API 或通过语言 sdk 之一来完成。在 C# 中(类似这样 - 我没有测试这一点),再延长一分钟:

queueMessage.UpdateMessage(message, 
    TimeSpan.FromSeconds(60),
    MessageUpdateFields.Visibility);

您还可以在此过程中修改消息(也许作为对代码的提示,让您知道 5 个报告中的哪一个已完成。这应该有助于您解决特定问题:如果消息被重新处理,您可以如果消息已修改为“处理来自 3-5 的报告”之类的内容,则不必处理所有五个报告。注意:您可以通过 | 组合 MessageUpdateFields 标志:

queueMessage.UpdateMessage(message, 
    TimeSpan.FromSeconds(0),
    MessageUpdateFields.Content);

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

关于Azure存储队列-处理时间长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28873578/

相关文章:

azure - 如何使用 az cli 列出存储 blob url?

r - 从 R 连接到 azure blob 存储 API 时出错

azure - 使用异地复制存储对 Azure 虚拟机进行灾难恢复

c# - 辅助角色和 Web 角色之间的 Azure 通信

wcf - Microsoft Azure 上的实时应用程序

azure - 在Worker角色中模仿Webjob中的Schedule功能

java - 如何修复:Azure Cosmos DB SQL API似乎不起作用

azure - 处理 Azure SQL 和地理复制上的外部数据源

reactjs - Azure 身份验证 - 访问 token 返回错误 AUD(00000003-0000-0000-c000-000000000000)

azure - Azure存储帐户说明-总请求图表