首页 > 解决方案 > 偶发性 MessageLockLostException 但锁未过期并且是相同的 MessageReceiver 实例

问题描述

我一直在为此挠头。大多数情况下它工作正常,但我们偶尔会收到 MessageLockLostException 集群。据我所知,能够完成消息的条件是正确的。

我们使用 Microsoft.Azure.ServiceBus.Core.MessageReceiver 创建如下

var messageReceiver = new MessageReceiver(
                            this.ConnectionString,
                            EntityNameHelper.FormatSubscriptionPath(topicName, subName),
                            ReceiveMode.PeekLock);

这是我们日志中的一个示例

1/7/2020, 11:35:42.689 AM Got message for processing messageId:51c90000ff1c00035d9408d79365b47e, clientId=MessageReceiver20live/delivery-p/Subscriptions/1of1, LockToken:137a02f1-eed7-4b0e-a84b-996d9ede002a, Expiry:1/7/2020 11:40:42 AM, IsLockSet:True
DO STUFF
1/7/2020, 11:36:19.204 AM Complete Message "messageId":"51c90000ff1c00035d9408d79365b47e","clientId":"MessageReceiver20live/delivery-p/Subscriptions/1of1","lockToken":"137a02f1-eed7-4b0e-a84b-996d9ede002a"
1/7/2020, 11:36:19.291 AM Microsoft.Azure.ServiceBus.MessageLockLostException

异常消息是“提供的锁无效。锁已过期,或者消息已从队列中删除,或者已由不同的接收器实例接收。” 但我认为这些条件中的任何一个都不成立。

  1. 您可以在上面看到锁定令牌匹配并且没有过期。
  2. 我知道消息尚未完成,因为它会在几分钟后重新发送(与锁定到期时间一致)
  3. 接收器实例匹配

标签: c#azureazureservicebus

解决方案


检查您是否没有超出基于信用的限制 - 请参阅https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-throttling

在尝试必须超过我的限制的吞吐量测试时,即使我有足够的时间直到锁定到期,我也会收到很多这些错误的消息锁定异常。如果我在获得锁异常(作为过期)后立即发出调用尝试更新锁,然后我会收到一个服务器繁忙异常,如下所示:

“请求已终止,因为名称空间 xxxxx 受到限制。错误代码:50009。请等待 2 秒,然后重试。”


推荐阅读