5

场景:producer发送消息到Storage Queue,一个WebJobs在QueueTrigger上处理消息,每条消息只能处理一次,可以有多个WebJob实例。

我一直在谷歌搜索,从我读过的内容来看,我需要编写处理消息的函数是幂等的,这样消息就不会被处理两次。我还读到消息的默认租用时间为 10 分钟。

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

4

2 回答 2

4

如果您使用内置队列触发器属性,它将自动确保任何给定消息都被处理一次,即使站点扩展到多个实例也是如此。这发布在讨论部分的文章中,https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started/

在同一篇文章中,您将找到有关 10 分钟租约的说明。总之,QueueTrigger 属性指示 WebJobs SDK 在队列中收到新消息时调用方法。消息被处理,当方法完成时,队列消息被删除。如果该方法在完成之前失败,则不删除队列消息;在 10 分钟的租约到期后,该消息被释放以再次被拾取和处理。如果消息总是导致异常,则不会无限期地重复此序列。在 5 次尝试处理邮件均不成功后,该邮件将被移至有害队列。最大尝试次数是可配置的。

于 2015-08-07T17:48:42.587 回答
3

您的过程需要是幂等的。因为

事实:

  • 一个网络作业租用一条消息(没有其他网络作业可以得到它)。
  • Web 作业在其作业完成时删除一条消息。
  • 如果一个 webjob 在处理消息时崩溃,它的租约将超时,另一个 webjob 将获取并开始处理它。(对于一条消息,默认重试次数为 5,之后它进入毒队列)

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

因此,您的过程需要是幂等的。

于 2016-02-15T14:08:25.857 回答