Сервисная шина Azure - продолжительность блокировки и дублирование, как они связаны?
У меня есть функция Azure, отслеживающая очередь служебной шины Azure с продолжительностью блокировки по умолчанию 30 секунд. Эта функция Azure отправляет уведомления по электронной почте на основе информации пользователя в сообщении, поступающем из очереди.
Я заметил, что выходили дубликаты электронных писем, и, таким образом, проверил журналы трассировки, чтобы выяснить, что функция Azure была вызвана дважды для одного и того же пользователя. Записи журнала следующие:
2018-08-09T14:38:05.1249371Z - Выполнение 'AzureFunction' (Reason='Обнаружено новое сообщение ServiceBus в' servicebusqueue '.', Id = 4657012a-94ac-4b22-a628-2e94285aeeb7)
2018-08-09T14: 38: 33.3335833Z - Выполнение 'AzureFunction' (Причина = 'Обнаружено новое сообщение ServiceBus в'servicebusqueue'.', Id=3ff8eea3-9b9b-43ae-a797-5acf01c2ae6c)
Сообщение было добавлено только один раз в очередь, и я пытаюсь понять, что может сгенерировать другое. Может ли это быть из-за продолжительности блокировки?
2 ответа
Да, это может быть связано с продолжительностью блокировки. Сообщение будет завершено (получено и удалено) из очереди только после завершения выполнения функции. Если время выполнения превышает 30 секунд, сообщение будет разблокировано, что сделает его доступным для любых других получателей.
В вашем случае получателем будет та же функция Azure, которая читает сообщение в другой раз, поэтому вы видите дублированную обработку сообщения.
Максимальное значение длительности блокировки составляет 5 минут. Если функция Azure просто отправляет уведомление по электронной почте при получении сообщения, вы можете увеличить продолжительность блокировки до 5 минут. Передача электронной почты не должна занимать так много времени, поэтому сообщение не будет доступно другому получателю.
Если у вас есть планы добавить что-то в функцию Azure в дополнение к отправке уведомления, вы можете настроить автоматическое продление блокировки в функции Azure. Дополнительные сведения см. Здесь. Это будет держать сообщение заблокированным, не оставляя опции для дублирования.
Сообщения добавляются только один раз, но это at-least-once
гарантия доставки с PeekLock
, Если ваше сообщение не было успешно завершено в течение 30 секунд с момента получения, оно будет разблокировано и получено снова. Увеличение длительности блокировки или сокращение времени обработки должно решить эту проблему.