我需要生成大量报告,报告可能需要大约5分钟才能生成,大量数据,许多不同来源。
客户端会将消息发布到Azure存储队列。有一个工作者角色可以处理消息并生成报告。
如果我想扩大规模,请说我最终会有10个工作人员角色来处理来自队列的消息并生成报告。然后我会将消息添加到队列中,如下所示:
如果我的工作者角色1将接收第一条消息并锁定它,但该过程将花费5分钟,则锁定将过期,并且消息将在队列中再次可见,因此工作者角色2将接受它并且开始处理......等等
如何避免消耗队列消息,只记得任务很长?
答案 0 :(得分:1)
首先:使用Azure存储队列,您应该为所有操作做好准备幂等:如果您的队列项被多次处理,每次都会发生相同的结果。我提出这个问题的原因:由于诸如你的角色实例之类的意外事件,根本没有办法保证你一次处理消息(除非你检查消息的DequeueCount
属性并相应地停止处理)崩溃/重新启动或您的队列项处理代码执行意外事件,如抛出异常。
下一步:可以通过编程方式扩展队列消息不可见超时。这可以通过队列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);
最后:如果您担心处理一批报告所花费的时间,可能会重新考虑为什么要在每封邮件中处理五个报告,而不是每封邮件一个报告。您始终可以批量读取队列消息。 这有点主观,因为实际上没有正确或错误的方法,但这只是你需要考虑的事情。