Сервисная шина Azure продолжает выдавать исключения MessageLockLostExceptions - PullRequest
0 голосов
/ 12 декабря 2018

Я получаю MessageLockLostExceptions при обработке сообщений.

Теперь я хочу смоделировать немного более длительную задачу обработки сообщений (но все еще в пределах LockDuration), добавив Task.Delay(10_000).Но затем я получаю MessageLockLostException точно за каждое 4-е сообщение.

Это происходит, даже если я установил MaxAutoRenewDuration = TimeSpan.FromDays(30) и 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!");
    }

Пример вывода:

======================================================
Press ENTER key to exit after receiving all the messages.
======================================================
Received message: 3659174697238584. Remaining lock duration: 00:00:30.8269132 - Complete!
Received message: 19421773393035331. Remaining lock duration: 00:00:20.5271654 - Complete!
Received message: 11540474045136941. Remaining lock duration: 00:00:10.3372697 - Complete!
Received message: 15762598695796784. Remaining lock duration: 00:00:00.1776760
Message handler encountered an exception     Microsoft.Azure.ServiceBus.MessageLockLostException: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue. Reference:2c6caac3-e607-4130-a522-f75e4636e130, TrackingId:3ff82738-664d-4aca-b55f-ba3900f1c640_B17, SystemTracker:ocgtesting:queue:workflow~63, Timestamp:2018-12-12T17:01:59
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.OnRenewLockAsync(String lockToken) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:line 1260
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.<>c__DisplayClass74_0.<<RenewLockAsync>b__0>d.MoveNext() in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:line 771
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func`1 operation, TimeSpan operationTimeout) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\RetryPolicy.cs:line 83
at Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func`1 operation, TimeSpan operationTimeout) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\RetryPolicy.cs:line 105
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.RenewLockAsync(String lockToken) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:line 773
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.RenewLockAsync(Message message) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:line 742
at Microsoft.Azure.ServiceBus.MessageReceivePump.RenewMessageLockTask(Message message, CancellationToken renewLockCancellationToken) in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\MessageReceivePump.cs:line 248.

Полный код здесь: https://pastebin.com/sFGBgE0s

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Единственное, чего не хватает в вашем репро, - это описание очереди.Важно отметить такие подробности, поскольку проблема, с которой вы сталкиваетесь, не имеет ничего общего с клиентом и, скорее всего, связана либо с брокером, либо с базовой библиотекой AMQP.

Для нераздельных очередей эта настройка работает нормально,Это не для секционированных очередей (стандартный уровень).Можно наблюдать как со старыми, так и с новыми клиентами.Я поднял проблему , связанную с брокером, для команды Azure Service Bus для расследования.

0 голосов
/ 13 декабря 2018

Вам нужно Complete сообщение до истечения срока действия Lock Token.Когда срок действия маркера блокировки истечет, вы получите MessageLockLostException во время полной операции.

Я вижу, что вы задерживаете выполнение потока на 10 секунд для каждого сообщения.Но сообщения, кажется, извлекаются в один и тот же момент времени, поэтому оставшаяся длительность блокировки продолжает уменьшаться для каждого сообщения.

Для четвертого сообщения длительность оставшейся блокировки равна 00:00:00.1776760.Итак, после 177 milliseconds срок действия блокировки истечет.Вы задерживаете поток на 10 seconds в следующей строке.Таким образом, срок действия блокировки истечет, и вы получите MessageLockLostException.Чтобы избежать этого исключения, удалите Delay

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...