NServiceBus через AzureStorage Отправка сообщения заняла больше времени, чем тайм-аут видимости

У меня есть NServiceBus, работающий поверх транспорта AzureStorageQueues.

Иногда мой обработчик сообщений показывает следующие две записи в журнале:

2018-08-27 12:27:23.0329 ИНФОРМАЦИЯ 5 Обработка сообщения...

2018-08-27 12:27:23.7359 ПРЕДУПРЕЖДЕНИЕ 5 Отправка сообщения заняла больше времени, чем время ожидания видимости. Сообщение снова появится в очереди и будет получено снова. NServiceBus.AzureStorageQueues.LeaseTimeoutException: всплывающее получение сообщения облачной очереди «2ebd6dd4-f4a1-40c6-a52e-499e22bc9f2f» является недопустимым, поскольку оно превысило следующее видимое время на «00:00:09.7359860».

Я понимаю, что существует тайм-аут видимости, который можно настроить, но по умолчанию он равен 30 секундам. И обрабатываемое сообщение обрабатывается дольше, чем эти 30 секунд.

Но что не имеет смысла, так это время этих двух записей в журнале. Обработчик запускается на 23,0329 секунды... а предупреждение появляется на 23,7359 секунды. Это всего 0,7 секунды. Это почему? Я ожидаю, что предупреждение от NServiceBus появится после 30-секундного InvisibilityTimeout.


person Shawn de Wet    schedule 28.08.2018    source источник


Ответы (1)


Если вы используете настройки по умолчанию, сообщения извлекаются в партии. Все сообщения в пакете имеют одинаковое значение времени ожидания видимости, равное 30 секундам. Существует также предел одновременной обработки (рассчитывается как max(2, number of logical processors), который может иметь воздействие, в результате чего некоторые сообщения из пакета ожидают завершения обработки предыдущих сообщений. Поэтому возможно, что ваше сообщение получено как часть пакета, но не обработано сразу, что приведет к истечению времени ожидания видимости.

Корректировка конфигурации путем настройки их для вашего конкретного сценария должна избавиться от этих повторных попыток обработки сообщений.

person Sean Feldman    schedule 28.08.2018
comment
Ссылка на партии — это то, что здесь имеет смысл! В то время, когда возникает проблема, существует большое количество незавершенных сообщений, которые нужно обработать, и если они извлекаются из очереди по 32 за раз, они не могут быть обработаны все в течение 30 секунд. Спасибо! - person Shawn de Wet; 29.08.2018