Что происходит с "незавершенными" заданиями при развертывании веб-задания?
Субъект говорит все на самом деле:) Скажем, у меня довольно занятая непрерывная веб-работа Azure, которая обрабатывается из очереди Azure:
public static void ProcessQueue([QueueTrigger("trigger")] Info info)
{ .... }
Если я повторно разверну веб-задание, я вижу, что любое выполняемое в настоящий момент задание кажется прерванным (я вижу статус "Никогда не завершен"). Повторяется ли эта работа после того, как я выпущен, или она потеряна навсегда?
Кроме того, есть хороший способ убедиться, что никакие задания не выполняются при развертывании веб-заданий, или разработчик сам должен написать решение для этого (например, флаг конфигурации, который проверяется при каждом запуске).
Спасибо
1 ответ
Когда WebJob, использующий WebJobs SDK, получает сообщение из очереди, он получает его с 10-минутной арендой. Если процесс обработки умирает во время обработки сообщения, срок аренды истекает через 10 минут, и сообщение возвращается в очередь. Если WebJob перезапустится, он снова выберет это сообщение. Сообщение удаляется только в случае успешного завершения функции.
Поэтому, если задание сразу же умирает и перезапускается, как в случае повторного развертывания, может потребоваться до 10 минут для повторного выбора сообщения. Кроме того, из-за этого рекомендуется либо сохранить состояние самостоятельно, либо сделать функцию идемпотентной.
На панели инструментов WebJobs вы увидите два вызова одного и того же сообщения. Один из них будет отмечен как Never Finished
потому что выполнение функции никогда не завершается.
К сожалению, не существует готового решения для предотвращения запуска заданий во время развертывания. Вы должны будете создать свою собственную логику, которая уведомляет (через сообщение очереди?), Что развертывание о начале, а затем прерывает хост. Прерывание хоста будет ожидать остановки любой существующей функции и будет препятствовать запуску новых. Тем не менее, это очень сложная ситуация, если у вас есть несколько экземпляров веб-задания, потому что только один из них получит уведомление.