我需要生成相当多的报告,一份报告可能需要大约5分钟才能生成,大量的数据,很多不同的来源。
客户端将向Azure存储队列发送消息。有一个工作角色处理消息并生成报告。
如果我想扩大规模,那么假设我最终得到了10个工作角色,它们将处理来自队列的消息并生成报告。然后将消息添加到队列中,如下所示:
如果我的worker角色1将接受第一条消息并在其上放置一个锁,但该进程将花费5分钟时间,则锁将过期,并且消息将在队列中再次可见,因此worker角色2将接受它并开始处理它.以此类推
如何避免只使用队列消息一次,同时要记住任务是一个长任务?
发布于 2015-03-05 12:14:32
首先:使用Azure存储队列,您应该为所有操作做好准备:如果您的队列项多次被处理,那么每次都应该发生相同的结果。我提出这个问题的原因是:根本无法保证您只处理一次消息(除非您检查消息的DequeueCount属性并相应地停止处理),原因是您的角色实例崩溃/重新启动或队列项处理代码做了一些意外的事情,比如抛出异常。
下一步:可以通过编程方式扩展队列消息不可见超时。这可以通过queue或语言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);最后:如果您关心处理一批报告所需的时间,那么也许可以重新考虑为什么您要在每条消息中处理5个报告,而不是每个消息处理一个报告。您始终可以分批读取队列消息。这有点主观,因为没有正确或错误的方法去做,但这只是你需要考虑的事情。
https://stackoverflow.com/questions/28873578
复制相似问题