【问题标题】:Azure ServiceBus - Lock supplied is invalidAzure ServiceBus - 提供的锁无效
【发布时间】:2021-05-23 05:36:36
【问题描述】:

我的 Azure Function 应用程序在新的服务总线消息队列上触发。我的前几条消息已成功处理,但一段时间后我开始收到以下错误: " Microsoft.Azure.ServiceBus:提供的锁无效。锁已过期,或者消息已从队列中删除。"

这是什么原因,我该如何解决??

Host.Json 文件:

{
  "functionTimeout": "05:05:00",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "prefetchCount": 100,
      "messageHandlerOptions": {
        "autoComplete": true,        
        "maxConcurrentCalls": 32,
        "maxAutoRenewDuration": "05:00:00"
      }     
    }
  }
}

【问题讨论】:

  • 函数应用配置的预取和最大函数持续时间是多少?
  • 最大功能持续时间??我在哪里配置?
  • 函数执行的最长时间,这就是我的意思。
  • 在 ASB 端 - 队列上的锁定持续时间。通常,持续时间太短会导致消息锁丢失,从而导致错误。
  • 我将函数“functionTimeout”属性配置为 5 小时,但仍然出现锁定错误。 ASB的锁定时长在哪里配置??

标签: azure-servicebus-queues


【解决方案1】:

请检查您是否使用的是最新版本的扩展程序。如果那不是 4.1.1 请升级它。参考:https://github.com/Azure/azure-functions-servicebus-extension/issues/38

如果出现此类问题,建议使用服务总线资源管理器工具检查死信原因。以下文档提到了与服务总线中的死信相关的详细信息以及导致消息死信的各种原因:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dead-letter-queues

例如: 如果问题在于交付计数,您可以将 MaxDeliveryCount 增加到其最大值(即 10)

你可以尝试显式实现重试逻辑:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-exceptions#messagelocklostexceptionhttps://github.com/jeffhollan/functions-csharp-queue-exponential/blob/master/ExponentialRetry.cshttps://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#service-bus

这里有几个相关的链接,你可以参考:

提供的锁无效。锁已过期,或者消息已从队列中删除 - 由于 AutoComplete 默认为 true。将值更新为 false 后,它已解决。

https://github.com/MassTransit/MassTransit/issues/802#issuecomment-294879874 – 从 AMQP 切换到 NetMessaging 协议后问题得到解决。

https://social.msdn.microsoft.com/Forums/azure/en-US/b86a64bb-cfcf-422b-a5fb-d831b7702c29/getting-an-exception-message-handler-encountered-an-exception?forum=servbus – 使用“ReceiveandDelete”模式后问题得到解决。

但是,我们推荐“PeekLock”。

【讨论】:

    【解决方案2】:

    问题是预取大小可能会导致缓存消息丢失其锁定令牌并在功能完成后尝试完成时抛出异常。

    减少预取计数应该会有所帮助。 documentation 详细说明了为什么会出现这种情况。长话短说,预取消息时间从收到消息的那一刻开始计时,而不是开始处理。如果消息在缓存中的停留时间过长,客户端仍然会处理它并抛出异常。

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多