0

通过使用 Azure 服务总线主题和订阅 - 我能够在两个系统之间传递消息。但是有时,我会收到此锁过期异常。如何避免呢?

异常- 消息处理程序遇到异常 Microsoft.Azure.ServiceBus.MessageLockLostException:提供的锁无效。锁已过期,或者消息已从队列中删除。

下面是代码:



static async Task MainAsync()
        {
           TokenProvider tokenProvider = TokenProvider.CreateManagedIdentityTokenProvider();

            subscriptionClient = new SubscriptionClient(serviceBusNamespace, topicName, subscriptionName, 
            tokenProvider, receiveMode: ReceiveMode.PeekLock);

            // Register subscription message handler and receive messages in a loop
            RegisterOnMessageHandlerAndReceiveMessages();
            Console.Read();

            await subscriptionClient.CloseAsync();
        }


 static void RegisterOnMessageHandlerAndReceiveMessages()
        {
            var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
            {
                MaxConcurrentCalls = 1,
                AutoComplete = false
            };

            // Register the function that processes messages.
            subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
        }

static async Task ProcessMessagesAsync(Message message, CancellationToken token)
        {
            // Process the message recieved.


            Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
            await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);

            }
4

1 回答 1

-1

锁丢失异常一般是客户端错误,有两种可能的原因,要么是服务总线端出现问题(高利用率,嘈杂的邻居等),要么是客户端太忙,无法完成请求及时或者有些网络很慢。

检查门户中的服务总线指标,并查看在您观察到问题时是否存在任何内部或服务器繁忙错误。如果不是,那么建议将查看您的客户端应用程序指标,并查看在此期间是否有任何可能导致问题的高利用率(CPU、内存、网络等)。

如果上述方法没有帮助并且仍然更频繁地观察到 lock lost 错误,那么我建议您在应用程序代码中添加日志记录,以确认消息完成所需的时间。如果您正在执行任何业务逻辑,请记录执行那段代码所需的时间。日志应该为您提供详细信息,您的应用程序正在使用的 messageID、UTC 时间范围、在该消息上获取的锁定令牌以及每个语句(业务逻辑)的执行时间您还可以在之前添加一个计时器并在 CompleteAsync 调用后检查将消息标记为完成所需的时间。如果您在代码中添加了任何预取,我还建议您删除预取。

如果问题在锁定时间内发生,则验证上述详细信息,则需要从客户端和服务总线端进行深入的故障排除。获得上述信息并在应用程序中添加更多登录后,您可以创建支持票证以获得进一步帮助,或者请向 AzCommunity[at]Microsoft[dot]com 发送一封主题为“Attn:Mayank”的电子邮件,引用此线程连同您的 Azure 订阅 ID、服务总线名称、队列名称、接收器应用程序详细信息以及异常消息、消息 ID、锁定令牌、您观察到问题的单个消息的时间范围。

于 2020-08-06T05:46:07.533 回答