Azure 服务总线不断抛出 MessageLockLostExceptions

MessageLockLostExceptions我在处理消息时不断收到。


我将 Microsoft.Azure.ServiceBus 3.2.0 与 .NET Core 2.1 一起使用。

我有一个LockDuration设置为 30 秒的队列,其中已经包含许多要处理的消息。

我从https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues#receive-messages获取了非常基本的消息接收教程代码-from-the-queue,效果很好。

LockDuration现在我想通过添加来模拟一个运行时间稍长的消息处理任务(但仍然在Task.Delay(10_000). 但随后我MessageLockLostException每 4 条消息都会收到一条。


即使我设置MaxAutoRenewDuration = TimeSpan.FromDays(30)and也会发生这种情况PrefetchCount = 0。


这是消息处理方法,我稍作改动以打印出剩余的锁定持续时间:


    private static async Task processMessagesAsync(Message message, CancellationToken token)

    {

        Console.Write($"Received message: {message.SystemProperties.SequenceNumber}. Remaining lock duration: {message.SystemProperties.LockedUntilUtc - DateTime.UtcNow}");

        await Task.Delay(10000);

        await queueClient.CompleteAsync(message.SystemProperties.LockToken);

        Console.WriteLine(" - Complete!");

    }


完整代码在这里:https ://pastebin.com/sFGBgE0s


函数式编程
浏览 195回答 2
2回答

MM们

您的复制品中缺少的一件事是队列描述。重要的是要注意这些细节,因为您遇到的问题与客户端无关,很可能与代理或底层 AMQP 库有关。对于非分区队列,此设置工作正常。它不适用于分区队列(标准层)。新老客户都可以观察到。我提出了一个与代理相关的问题,供 Azure 服务总线团队进行调查。

犯罪嫌疑人X

您需要Complete在消息Lock Token过期之前收到消息。Lock Token 过期后,您将MessageLockLostException在整个操作过程中收到。我可以看到您将每条消息的线程执行延迟 10 秒。但是这些消息似乎是在同一时间获取的,这就是为什么每条消息的剩余锁定持续时间不断减少的原因。对于第四条消息,剩余锁定持续时间为00:00:00.1776760。所以,在 之后177 milliseconds,锁就会过期。您正在下一行延迟线程10 seconds。所以,锁会过期,你会得到MessageLockLostException. 为避免此异常,请删除 Delay
打开App,查看更多内容
随时随地看视频慕课网APP