#azure #web-deployment #azure-webjobs #webjob #netcoreapp3.1
#azure #веб-развертывание #azure-webjobs #webjob #netcoreapp3.1
Вопрос:
У меня есть веб-задание в Azure, размещенное в службе приложений, которая ни для чего не используется. В настоящее время я развертываю свой webjob из Visual Studio, но в будущем это изменится, поскольку он не находится в производстве. Это веб-задание приложения .NET Core 3.1, которое компилируется в EXE, но это не должно иметь значения для этого вопроса (и я знаю о функциях Azure, но это также не является частью моего вопроса).
Веб-задание — это непрерывное веб-задание, запускаемое очередью. Я настроил его на одновременный запуск 10 пакетов. Я искал ответы в Интернете, но нашел неясные ответы.
Мой вопрос: допустим, у меня запущено 3 задания. Затем я развертываю новую версию EXE-файла. Похоже, это работает без проблем. Но что происходит с выполняемыми заданиями? Будут ли они выполняться до конца? Или произойдет сбой и остановка? Мне не совсем удалось разобраться в этом, и я хотел спросить здесь, если у кого-то есть полезный опыт в этом.
Моя конфигурация, связанная с очередью, выглядит следующим образом, если это полезно:
.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage(a =>
{
a.BatchSize = 10;
a.NewBatchThreshold = 5;
a.MaxDequeueCount = 1;
a.MaxPollingInterval = TimeSpan.FromSeconds(20);
});
})
Спасибо!
Ответ №1:
Но что происходит с выполняемыми заданиями? Будут ли они выполняться до конца? Или произойдет сбой и остановка?
Когда веб-задание, использующее пакет SDK WebJobs, получает сообщение из очереди, оно получает его с арендой на 10 минут. Если процесс задания завершается во время обработки сообщения, срок аренды истекает через 10 минут, и сообщение возвращается в очередь. Если веб-задание будет перезапущено, оно снова выберет это сообщение.Сообщение удаляется только в случае успешного завершения функции.
Поэтому, если задание завершается и немедленно перезапускается, как в случае повторного развертывания, может потребоваться до 10 минут, чтобы снова получить сообщение. Кроме того, из-за этого рекомендуется либо сохранить состояние самостоятельно, либо сделать функцию идемпотентной.
На панели мониторинга WebJobs вы увидите два вызова для одного и того же сообщения. Одно из них будет помечено как незавершенное, поскольку выполнение функции так и не было завершено.
К сожалению, не существует готового решения для предотвращения запуска заданий во время развертывания. Вам нужно будет создать свою собственную логику, которая уведомляет (через сообщение очереди?) что развертывание начинается с запуска, а затем прерывает хост. Прерывание хоста будет ожидать остановки любой существующей функции и предотвратит запуск новых. Однако это очень сложная ситуация, если у вас есть несколько экземпляров webjob, потому что только один из них получит уведомление.
Комментарии:
1. Круто, я так и предполагал, но очень хорошо получить подтверждение без необходимости настраивать задания, которые регистрируют и тестируют все это. Спасибо!