2017-01-17 3 views
1

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

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, Stream srcBlob, Binder binder, TraceWriter log) 
{ 
    log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}"); 

    // Get request model 
    var input = await req.Content.ReadAsAsync<ConvertInputModel>(); 

    //Run convert in separate thread 
    Task.Run(async() => { 
     //Read input blob -> convert -> upload output blob 
     var convertResult = await ConvertAndUploadFile(input, srcBlob, binder, log); 

     //return result using HttpClient 
     SendCallback(convertResult, input.CallbackUrl); 
    }); 

    //Return response immediately 
    return req.CreateResponse(HttpStatusCode.OK); 
} 

Проблема, связанная с заменой новой задачи. Я получаю исключение при доступе к параметрам. Итак, как я могу запускать длительную операцию в отдельном проходе? Или такое решение совершенно неверно?

+0

Я не знаю внутренней реализации Azure Functions, но я был бы очень удивлен, если бы вы могли запускать подобные фоновые задачи. Вам нужен новый дизайн, например, например, отбрасывание сообщения в очереди, а также получение другого процесса, такого как веб-задание. – Crowcoder

ответ

7

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

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

При таком подходе вы выполняете по существу то же самое, где фактическая обработка будет сделана асинхронно, но надежным и эффективным способом (выгоды от автоматического масштабирования, чтобы правильно обрабатывать повышенные нагрузки, при необходимости)

Do имейте в виду, что при использовании плана потребления время ожидания функции составляет 5 минут. Если ожидается, что обработка займет больше времени, вам нужно будет запустить вашу функцию по выделенному плану с включенным AlwaysOn.

+1

Есть ли какая-то документация по этому вопросу, на которую можно было бы обратить внимание? –

Смежные вопросы