Способны ли веб-задания Azure поддерживать выполнение задачи в фоновом режиме?

#c# #azure-webjobs

Вопрос:

В настоящее время я испытываю трудности с выполнением длинного HTTP-запроса в веб-задании. То же приложение работает нормально при запуске на локальном компьютере. Поскольку я перепробовал несколько способов заставить это работать, мне теперь любопытно, возможно ли это вообще.

Мой тестовый код ниже:

         static void Main(string[] args)
        {
            /// [...]Getting configuration and using it in "SendPayload"

            _stopwatch = new Stopwatch();
            _stopwatch.Start();

            Task.Run(async () => { await SendPayloadAndAwait(configuration); });
            while (_isWaiting)
            {
                if (_stopwatch.ElapsedMilliseconds % 5000 == 0)
                {
                    Console.WriteLine(".");
                }
            }
        }

        public static async Task<string> SendPayloadAndAwait (RequestModel targetRequest)
        {
              /// [...]Preparing client and payload 

              Console.WriteLine("Start");
              Response= curClient.SendAsync(req).Resu<
              var endContent = Response.Content.ReadAsStringAsync().Resu<
              Console.WriteLine("End");

             _isWaiting = false;
             return "Done";
        }
 

«Конец» никогда не печатается в консоли веб-заданий, это бесконечный (вплоть до тайм-аута) цикл «.». Такой сценарий каким-то образом запрещен?

Комментарии:

1. Веб-приложения Azure по умолчанию переходят в спящий режим после периода бездействия. Настроено ли ваше веб-приложение, содержащее это веб-задание, на «Всегда включенное»?

2. @mehmetseckin мое рассуждение состояло в том, что, поскольку существует постоянный вывод, веб-приложение «останется в живых» для этого процесса. Будет ли достаточно изменить службу приложений на Всегда включенную, или работа также должна быть непрерывной?

3. Согласно этой заметке , время ожидания веб-приложения истекает после 20 минут бездействия, и только запросы к фактическому веб-приложению сбрасывают этот таймер. Веб-задания выполняются асинхронно в отдельном процессе, поэтому они не заставляют веб-приложение «бодрствовать».

4. @mehmetseckin Я переключился на «Всегда включен», а также попытался снова, когда задание было установлено как непрерывное, но в обоих случаях HTTP-запрос, похоже, выполняется бесконечно. В данном конкретном случае я ожидаю ответа не более чем через 6-7 минут, так что даже эта 20-минутная отметка должна быть больше, чем нужно.

Ответ №1:

То, как я решил в предыдущей компании, заключалось в том, что у меня была длительная работа в веб-API, которая была реализована как функция Azure, было

  • Первый вызов (т. е. /api/StartJob)
    • создает запись о задании (в таблице azure)
    • запускает фоновую нить
    • возвращает статус 202 [Принято] с идентификатором записей о заданиях
  • Фоновый поток выполняет длительную задачу, обновляя запись задания по мере ее выполнения
  • Цикл клиента (в процентах от выполненного
    • Статус запросов (т. е. /api/Статус задания)
      • Если процент выполнения = 100, завершите цикл

Это было очень успешно и надежно при условии, что у нас был оплаченный план

Бесплатные планы завершают сеанс примерно через 5 минут (по замыслу).

Ответ №2:

Вам нужно будет включить параметр «Всегда включено», чтобы убедиться, что ваша длительная работа не будет прекращена.

Время ожидания веб-приложения истекает после 20 минут бездействия, и только запросы к фактическому веб-приложению сбрасывают этот таймер. Веб-задания выполняются асинхронно в отдельном процессе, поэтому они не заставляют веб-приложение «бодрствовать».

Вот примечание из документации по веб — заданиям:

Веб-приложение может выйти из строя после 20 минут бездействия. и только запросы к реальному веб-приложению могут сбросить таймер. Просмотр конфигурации приложения на портале Azure или отправка запросов на сайт расширенных инструментов ( https://<app_name>.scm.azurewebsites.net ) не приводит к сбросу таймера. Если вы настроили свое веб-приложение на непрерывный или запланированный запуск (таймер-триггер) Веб-задания, включите параметр Всегда включено на странице конфигурации Azure вашего веб-приложения, чтобы обеспечить надежную работу веб-заданий. Эта функция доступна только на Базовом, Стандартном и Премиальном уровнях ценообразования.

Комментарии:

1. Я переключился на «Всегда включено», а также повторил попытку, установив задание как непрерывное, но в обоих случаях HTTP-запрос, похоже, выполняется бесконечно. В данном конкретном случае я ожидаю ответа не более чем через 6-7 минут, так что даже эта 20-минутная отметка должна быть больше, чем нужно. Я проведу еще один тест, переведя все на синхронное выполнение, чтобы определить, является ли это проблемой задачи или проблемой с самим запросом.

2. Веб — задание, выполняемое полностью синхронно, отправка запроса никогда не завершается в веб-задании-независимо от настроек «Всегда включено» и «Запущено»/»Непрерывно». Я очень смущен этим, потому что не вижу причины, по которой это не сработает. Консоль веб-заданий не возвращает никаких ошибок, и код по-прежнему работает при локальном выполнении.

3. После дальнейших исследований я наткнулся на эту тему — похоже, что для HTTP-запросов время ожидания еще меньше-230 секунд, и оно не настраивается. Рекомендуется либо перейти на виртуальную машину, либо реализовать какой-то асинхронный шаблон.