it-swarm.com.ru

Как "обмануть" функцию Azure для запуска более 10 минут

Функции Azure имеют ограничение по времени 10 минут. Предположим, у меня есть долгосрочное задание, такое как загрузка файла, загрузка которого занимает 1 час.

[FunctionName("PerformDownload")]
[return: Queue("download-path-queue")]
public static async Task<string> RunAsync([QueueTrigger("download-url-queue")] string url, TraceWriter log)
{
   string downloadPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString);
   log.Info($"Downloading file at url {url} to {downloadPath} ...");
   using (var client = new WebClient())
   {
       await client.DownloadFileAsync(new Uri(url), myLocalFilePath);
   }
   log.Info("Finished!");   
}

Есть ли какой-нибудь хакерский способ сделать что-то вроде этого запуска, а затем возобновить в другой функции до истечения срока? Или есть ли лучший способ вообще интегрировать какую-то длинную задачу, подобную этой, в рабочий процесс, использующий функции Azure?

(На заметку о том, что простые веб-задания Azure устарели? Я не могу найти их в разделе «Ресурсы».)

2
user7127000

В зависимости от сведений о вашей рабочей нагрузке можно использовать еще один вариант - использовать экземпляры контейнеров Azure. Вы можете настроить свою функцию Azure на ускорение работы контейнера, обработку рабочей нагрузки (загрузить файл, выполнить некоторую обработку и т.д.), А затем закрыть свой контейнер за вас. Время раскрутки обычно составляет несколько секунд, и вы платите только за то, что используете (нет необходимости в выделенном плане обслуживания приложения или экземпляре vm). Подробнее о ACI здесь

2
Josh Carlisle

Добавление для других, кто может встретиться с этим сообщением: рабочие процессы, состоящие из нескольких функций Azure, могут быть созданы в коде с использованием расширения Durable Functions , которое можно использовать для создания функций оркестровки, которые планируют асинхронные задачи, завершают работу и повторно пробуждаются. когда асинхронная работа завершена 

Они не являются прямым решением для долгосрочных задач, для которых требуется открытый порт TCP, например для загрузки файла (для этого функция, выполняемая в плане обслуживания приложения, не имеет ограничения по времени выполнения), она может использоваться для интеграции таких задач в больший рабочий процесс.

2
Katy Shimizu

Есть ли какой-нибудь хакерский способ заставить что-то подобное начать и потом возобновить в другой функции до истечения срока?

Если вы находитесь в плане потребления, вы не можете контролировать, как долго работает ваше приложение-функция, и поэтому было бы ненадежным использовать фоновые потоки, которые продолжают работать после завершения точки входа в функцию. 

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

Или есть ли лучший способ вообще интегрировать какую-то длинную задачу, подобную этой, в рабочий процесс, использующий функции Azure?

Да. Используйте Azure Data Factory , чтобы скопировать данные в хранилище BLOB-объектов, а затем обработать их. Конвейер фабрики данных может вызывать функции как до, так и после операции копирования.

2
David Browne - Microsoft

Через 10 минут (в зависимости от настройки времени ожидания в файле Host.json ) после запуска последней функции вашего функционального приложения остановится VM, в котором запущено ваше функциональное приложение.

Чтобы предотвратить такое поведение, вы можете использовать пустую функцию Timertrigger , которая запускается каждые 5 минут. это ничего не будет стоить и будет поддерживать ваше приложение в рабочем состоянии.

0
Thomas