场景:生产者向存储队列发送消息,WebJobs处理QueueTrigger上的消息,每条消息只能处理一次,可能有多个WebJob实例。
我一直在谷歌搜索,从我读过的,我需要编写处理消息的功能是幂等的,所以消息不会被处理两次。我还读到,邮件的默认租约时间为10分钟。
我的问题是,当在一个WebJob实例上触发QueueTrigger时,它是否在消息上设置了租约时间,以便另一个WebJob无法获取相同的消息?如果是这样,为什么我需要考虑消息可以被处理两次的可能性?或者我误解了这个?
答案 0 :(得分:4)
如果您正在使用内置队列触发器属性,它将自动确保任何给定的消息都被处理一次,即使站点扩展到多个实例也是如此。这发布在讨论部分https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started/
中的文章中在同一篇文章中,您将找到有关10分钟租约的说明。总之,QueueTrigger属性指示WebJobs SDK在队列中收到新消息时调用方法。将处理该消息,并在方法完成时删除队列消息。如果方法在完成之前失败,则不删除队列消息;在10分钟的租约到期后,该消息将被释放以便再次接收并处理。如果消息总是导致异常,则该序列将无限期地重复。在尝试处理消息5次失败后,消息将移至毒性队列。最大尝试次数是可配置的。
答案 1 :(得分:3)
您的流程必须是幂等的。因为
事实:
因此,如果webjob在其作业完成后但在删除消息之前崩溃,则该消息将在一段时间后释放,并且将再次执行相同的作业。
因此,您的流程必须是幂等的。