gpt4 book ai didi

c# - 完成锁定消息时出现 Azure 服务总线 MessageLockLostException

转载 作者:行者123 更新时间:2023-12-04 04:07:40 25 4
gpt4 key购买 nike

在执行 30 分钟到一个多小时的长时间操作后,在 Azure 服务总线上执行完整操作时,我收到 MessageLockLostException。我希望这个过程能够扩展并能够适应故障,因此我保持消息锁并在 1 分钟的默认锁定持续时间内很好更新它。然而,当我尝试在最后完成消息时,即使我可以看到所有锁更新都在正确的时间发生,我还是收到了 MessageLockLostException。我想在将来扩大这一规模,但目前该应用程序只有一个实例,我可以确认该消息在出错后仍然存在于服务总线订阅上,因此问题肯定是与锁有关。

这是我采取的步骤。

  1. 获取消息并配置锁
messages = await Receiver.ReceiveAsync(1, TimeSpan.FromSeconds(10)).ConfigureAwait(false);
var message = messages[0];
var messageBody = GetTypedMessageContent(message);
Messages.TryAdd(messageBody, message);
LockTimers.TryAdd(
messageBody,
new Timer(
async _ =>
{
if (Messages.TryGetValue(messageBody, out var msg))
{
await Receiver.RenewLockAsync(msg.SystemProperties.LockToken).ConfigureAwait(false);
}
},
null,
TimeSpan.FromSeconds(Config.ReceiverInfo.LockRenewalTimeThreshold),
TimeSpan.FromSeconds(Config.ReceiverInfo.LockRenewalTimeThreshold)));
  • 执行长时间运行的进程

  • 完成消息

  • internal async Task Complete(T message)
    {
    if (Messages.TryGetValue(message, out var msg))
    {
    await Receiver.RenewLockAsync(msg.SystemProperties.LockToken);

    await Receiver.CompleteAsync(msg.SystemProperties.LockToken).ConfigureAwait(false);
    }
    }

    上面的代码是其中的精简版本,我删除了一些 try catch 错误处理和日志记录,但我可以确认在调试问题时我可以看到计时器按时执行。只是“CompleteAsync”失败了。

    附加信息;

    • 服务总线主题已启用分区
    • 我尝试以阈值的 80%(48 秒)、阈值的 30%(18 秒)和阈值的 10%(6 秒)进行续订
    • 我四处寻找答案,找到的最接近的答案是 this article但这是 2016 年的事了。
    • 我无法让它在独立的控制台应用程序中失败,所以我不知道这是否是我在应用程序中所做的事情,但我可以确认锁更新在处理期间发生并返回更新锁的正确日期时间,我希望如果锁确实丢失,CompleteAsync 将会失败
    • 我正在使用 Microsoft.Azure.ServiceBus nuget 包 Version="4.1.3"
    • 我的应用程序是 Dotnet Core 3.1,并使用以 Dotnet Standard 2.1 编写的服务总线包装器包
    • 如果您长时间不持有该消息,消息就会完成,即使您长时间持有,该消息偶尔也会完成。

    任何关于如何在一小时后成功完成服务总线消息的帮助或建议都会很棒

    最佳答案

    这里的问题不在于我的代码。这是关于服务总线主题的分区。如果您四处搜索,就会发现 Microsoft GitHub 上存在一些有关消息完成的问题。无论如何,这并不重要,因为我在这里使用的修复是使用订阅转发功能将消息移动到禁用分区的新主题,然后从该新主题读取消息,并且我能够使用完全相同的代码来保留消息被锁定很长时间仍然成功完成

    关于c# - 完成锁定消息时出现 Azure 服务总线 MessageLockLostException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62258165/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com