【问题标题】:Azure Storage Queue and multiple WebJobs instances: will QueueTrigger set the message lease time on triggered?Azure 存储队列和多个 WebJobs 实例:QueueTrigger 会在触发时设置消息租用时间吗?
【发布时间】:2015-08-06 17:33:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: azure-webjobs azure-storage-queues


    【解决方案1】:

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

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

    【讨论】:

    • 对不起,这是一个旧答案,但这也适用于 Azure Functions 吗?我已经阅读了很多地方,以至于当可见性到期时,即使该函数仍在处理中,消息也会再次出现在队列中。我很困惑,因为默认的可见性超时是 00:00:00。我在这里有一个问题:stackoverflow.com/questions/55757623/…
    【解决方案2】:

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

    事实:

    • 网络作业租用消息(其他网络作业无法获取)。
    • Web 作业在其作业完成后删除一条消息。
    • 如果 Web 作业在处理消息时崩溃,它的租约将超时,另一个 Web 作业将获取并开始处理该消息。 (消息的默认重试次数为 5 次,然后进入中毒队列)

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

    因此你的过程需要是幂等的。

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      相关资源
      最近更新 更多