为了账号安全,请及时绑定邮箱和手机立即绑定

Azure 服务总线不断抛出 MessageLockLostExceptions

Azure 服务总线不断抛出 MessageLockLostExceptions

C#
函数式编程 2022-06-12 10:51:31
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
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

您的复制品中缺少的一件事是队列描述。重要的是要注意这些细节,因为您遇到的问题与客户端无关,很可能与代理或底层 AMQP 库有关。

对于非分区队列,此设置工作正常。它不适用于分区队列(标准层)。新老客户都可以观察到。我提出了一个与代理相关的问题,供 Azure 服务总线团队进行调查。


查看完整回答
反对 回复 2022-06-12
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您需要Complete在消息Lock Token过期之前收到消息。Lock Token 过期后,您将MessageLockLostException在整个操作过程中收到。

我可以看到您将每条消息的线程执行延迟 10 秒。但是这些消息似乎是在同一时间获取的,这就是为什么每条消息的剩余锁定持续时间不断减少的原因。

对于第四条消息,剩余锁定持续时间为00:00:00.1776760。所以,在 之后177 milliseconds,锁就会过期。您正在下一行延迟线程10 seconds。所以,锁会过期,你会得到MessageLockLostException. 为避免此异常,请删除 Delay


查看完整回答
反对 回复 2022-06-12
  • 2 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信