Развертывание Azure WebJob

#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. Круто, я так и предполагал, но очень хорошо получить подтверждение без необходимости настраивать задания, которые регистрируют и тестируют все это. Спасибо!