Azure存储队列和多个WebJobs实例:QueueTrigger会在触发时设置消息租约时间吗?

时间:2015-08-06 17:33:18

标签: azure-webjobs azure-storage-queues

场景:生产者向存储队列发送消息,WebJobs处理QueueTrigger上的消息,每条消息只能处理一次,可能有多个WebJob实例。

我一直在谷歌搜索,从我读过的,我需要编写处理消息的功能是幂等的,所以消息不会被处理两次。我还读到,邮件的默认租约时间为10分钟。

我的问题是,当在一个WebJob实例上触发QueueTrigger时,它是否在消息上设置了租约时间,以便另一个WebJob无法获取相同的消息?如果是这样,为什么我需要考虑消息可以被处理两次的可能性?或者我误解了这个?

2 个答案:

答案 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租用一条消息(没有其他webjob可以获得它)。
  • 当工作完成时,webjob会删除一条消息。
  • 如果webjob在处理邮件时崩溃,其租约将超时,另一个webjob将获取并开始处理该邮件。 (对于一个消息,默认重试为5,之后它会进入毒药队列)

因此,如果webjob在其作业完成后但在删除消息之前崩溃,则该消息将在一段时间后释放,并且将再次执行相同的作业。

因此,您的流程必须是幂等的。