2016-05-17 25 views
0

私はAzureで実行しているWebアプリケーションを持っています。長いプロセスを処理するAPIエンドポイントがあります(約1時間)。ビジュアルスタジオでローカルに走っているときは問題ありませんが、紺碧に行くと、要求が55秒間始まると失敗します。Azure Web Appsタイムアウトロングプロセスリクエスト

私はすべてのプラットフォームでこの問題を解決しました。このコード行をエンドポイントに追加する機会を変更します。

System.Web.HttpContext.Current.Server.ScriptTimeout = 10000; 

これでタイムアウトまで延長することができましたが、3分50秒後には処理できません。この時点で、私はLoad Balancerと呼んでいることが分かりました。彼らは、Azure Load Balancerが4分後にすべてのリクエストを自動的に終了すると言っています。だから私はこの場所にこだわった。

私はこれらすべての解決策を試しています。

1.System.Web.HttpContext.Current.Server.ScriptTimeout = 10000; 2.System.Net.ServicePointManager.SetTcpKeepAlive(true、30000、30000); 3.新しいスレッドの開始を使用して長いプロセスを処理し、httpステータスコードをプロセスが開始されたクライアントの初期値に戻します。 4.別の非同期関数として長いプロセスを作成する

私が達成しようとしているのは、スケジューラータスクまたは手動(AJAX呼び出し)によってトリガーできる非常に単純な長いプロセス関数です。

提案がありますか?

+0

は、私はあなたのサーバー側で何が起こるか、その後APIクライアント側で発生し、何の説明(または何を打破する必要があると思います起こることを望んでいます)私はアプローチ3の詳細を見るのが好奇心です。あなたがすぐに帰ってきた場所 - なぜこれが失敗するのですか? –

+0

@ G.StoynevクライアントのエンドポイントはAJAX呼び出しとなり、最初の設計はこの長いプロセスが終了した後にサーバーに戻り、サーバーの終了はプロセス全体のフローを開始します(チェック、データの追加データベースが、レコードは巨大です)。アプローチ3はちょうど私のばかげたアイデアだから、クライアントはプロセスが完了したかどうかの結果を得たくないと言って、サーバーからの応答を得て、 "Process is start"をユーザーに表示する。スレッドはバックグラウンドで実行されるのが好きなので、ユーザーに結果を返す必要はありません。 提案はありますか? –

+0

要求が処理を開始したが完了していない場合、クライアントがAjax呼び出しを開始し、サーバーがhttp受け入れ状況を返すのはどうですか?クライアント側では、完了したことを示すhttp OKステータスを受け取るまで、onsuccessハンドラはサーバを再クエリできます。 ofcourseクライアントは、操作を一意に識別する正弦波の方法を知っていなければなりません。 –

答えて

1

私はこのプロセスでどのように解決するのですか。

それは長期的プロセスがある場合、それは全体のプロセスをスピードアップするために、私は2015年

また、Visual Studioの上AzureのWebJob SDKを使用してwebjobへのプロセス全体を書き換える必要があり、ウェブの仕事に対処しなければなりません(ちょうど紺碧のクレジットのコストを節約するために)、私はDatabaseContextを使用し、匿名型のToList()に対して必要なすべてのテーブルrunnigを作成します。 Finanlly、私は挿入する必要がある項目のリストを取得し、BulkInsertを使用します。

すべてが3分間で実行されます。Azure実行時間は70,000エントリです。

//最新の実装

の更新、私はまだいくつかのバックグラウンド・プロセスのためのWebJobを使用していますが、私は私の論理的なプロセスのためのParallel.ForEach()とともに、EntityFramework BulkInsertを使用して、私のプロセスをスピードアップ。 さらに、バルク更新を扱う場合は、using(var context=new DatabaseContext()){...}でParallel.ForEach()を使用します。

以外にも、私はAuzre.WebJobの代替であるように思わAzure.Functionsを試してみません(そこにあまりにも良いソリューションを提供bulk.updateライブラリがあります)。同じキュートリガを使用することにより、WebJobよりも速いトリガです。

すべてのバックグラウンドプロセスについて、Azureはあなたにはほとんど解決策がありません。誰でもこれを必要とする人を共有してください。

  • WebJob
  • 機能
  • ロジックアプリ
1

Azure Web Appsのデフォルトタイムアウトになると思います(正しく覚えていれば間違っているかもしれませんが、3分と思っています)。ポータルからSCM_COMMAND_IDLE_TIMEOUTを設定できますか - Webアプリケーション設定=>アプリ設定=>設定を必要な値(たとえば360(秒))で追加します。 Reference。 時間外のときに外部操作を強制終了する機能があります(上記のリンクに情報があります)。

+1

これはhttp要求のタイムアウトにどのように関連していますか?この値は "デフォルトで、ビルドプロセスがいくつかのコマンドを起動したときに、出力を生成せずに最大60秒間実行することができますが、それが十分でない場合は、10分にするなど" –

0

あなたのご質問のほとんどに答えているわけではありませんが、私はあなたの "3。この問題を解決するための最初のステップは、AJAXクライアントに成功ステータスをすぐに返すことです。

一般的なWeb要求よりも長い時間アイドル状態になっているような接続では、TCP/IP/HTTPトラフィックのトラフィックが発生します。これらの動作は、アプリケーション(レイヤー)の外部ではなく、インフラストラクチャレイヤーの下部にあります。あなたはこれらにアクセスしている場合としていない場合があります。

あなたの質問から、ポーリングまたはプッシュ通知の何らかの形を組み合わせることで、より良い解決策があなたのIMOです。

関連する問題