2017-01-17 14 views
1

Azure関数を使用してファイル変換を実装しようとしています。変換には多くの時間がかかります。したがって、私は呼び出し側サーバーでの応答を待っていません。 私は応答をすぐに返す(サービスが利用可能であり、変換が開始されていることを示すために)関数を書いて、別のスレッドで変換を実行します。コールバック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); 
} 

新しいタスクがバインディングを中断する問題。私はparamsにアクセスする際に例外が発生します。だから、どうすれば別のトレッドで長時間の運転をすることができますか?または、そのような解決策は完全に間違っていますか?

+0

Azure関数の内部実装についてはわかりませんが、そのようなバックグラウンドタスクを実行できるのであれば、私は非常に驚くでしょう。たとえば、キュ​​ーにメッセージをドロップするなどの新しい設計が必要で、Webジョブのような別のプロセスが必要になります。 – Crowcoder

答えて

7

このパターンはAzure関数では推奨されません(またはサポートされていません)。特に、消費計画で実行している場合、ランタイムは関数の有効期間を正確に管理することができず、最終的にサービスを停止します。

ここで推奨される(広く使用されている)パターンの1つは、この作業を別の関数で処理し、そのキューでリッスンし、その応答をクライアントにすぐに返すことです。このアプローチでは、あなたは基本的に(必要に応じて、適切に増加した負荷を処理するために自動スケーリングの恩恵を受けて)実際の処理は非同期で行われますが、信頼性の高い効率的な方法でされます、同じことを達成

ドゥ消費計画を使用する場合、5分の機能タイムアウトがあることに注意してください。処理に時間がかかると予想される場合は、AlwaysOnを有効にした専用プランで関数を実行する必要があります。

+1

これについて私が指摘できる文書がありますか? –

関連する問題