最近、Azure関数がタイムラインのどこかで動的価格設定階層で5分のタイムアウトを取得したことに気づきました。私は他のことをするのに忙しかったので、これは私のレーダーの下で飛んで、いくつかの長時間実行されている機能が完了していないことに気づきました。
そこで掘り下げてみると、動的とアプリサービスベースの2つの価格帯があることがわかりました。このサイトは全体のコンセプトが少し曖昧ですが、私が理解しているように、これはそれがどのように立っているかです:
動的:ユーザーによる使用時間とメモリ割り当てごとに課金されます。 5分のタイムアウト(1回の長時間実行操作には役に立たない)。
アプリサービス:基本または標準層のVMで、フルタイムで実行され、トリガーを待機します。話すタイムアウトはありません。
1年に1〜2回解雇する必要がある仕事の解決策として機能を見たので、最初はがっかりしましたが、完了するまでに1〜2日かかります(包括的なバックアップとエクスポート用のデータパッケージング)。
2つ目は私を混乱させます-これは、ステートレス関数がWebアプリとして実行されるようになり、そのように課金されることを意味しますか?この場合、Cellプロセッサを実装して、トリガー時に80000個の関数インスタンスを起動して作業を時間どおりに完了しない限り、関数の概念全体が私の目的には役に立たなくなります。それさえ可能なら。
関数の価格設定の背後にあるモデルと、私の問題に対する最善の解決策を誰かに説明してもらえますか?
ありがとうございました。
Azure BatchServiceはあなたが求めているものです。
基本的に、必要なときに必要なコンピューティングリソースをスピンアップできます。使用するコンピューティング時間に対してのみ料金を支払うため、バッチサービス自体(エラー検出、再試行、自動スケーリングなどのあらゆる種類の機能を提供します)は発生しません。追加料金。 (ちなみに、独自のAPIがあるため、必要に応じて完全に自動化できます)
作業の実行を開始する前に、プール内の各VMにカスタムソフトウェアをインストールできます。
カスタマイズ可能なルールに基づいてバッチサービスを自動的にスケーリングすることも、固定サイズのプールを作成して手動でスケーリングすることもできます。
https://Azure.Microsoft.com/en-gb/services/batch/
Updatethis GitHubの問題に関するコメントによると、FunctionAppが既存のAppService Planを使用している場合、タイムアウト適用されません。どうやら、動的オプションまたは「消費プラン」のタイムアウトは、基盤となるプラットフォームVMインスタンスのタイムアウトと関係があるようです。したがって、それは別のルートかもしれません。タイムアウトなしでFunctionAppの良さを使用します。
関数は、短いタスク(5分未満)を処理するように設計されています。ただし、回避策があります。 ARMテンプレートを作成して、Webアプリサービス層を備えた関数アプリをデプロイし、処理が完了したら削除できます。関数の代わりにWebジョブを使用できます(ただし、料金を支払う必要があります)。 Webアプリ)。
このスレッドの誰かが言ったように、プロセスの使用頻度が低く、さらに完了するまでに数日かかる場合は、Azureの自動化などを検討する必要があります。
規模(ファイル数/ファイルのソースと宛先およびバックアップ)を正確に知らなくても、ソリューションをより小さなチャンクに分割し(タスク=>関数)、チャンクを別々のアプリプランにデプロイすることができます
主人
ワーカー
金銭的な観点からは、消費計画約Gb/s(使用されたメモリと実行時間)によって課金される場合、ホストが長時間実行の実行を防止することは完全に理にかなっています。 。
お役に立てれば
このスレッドはもう少し明確にする価値があります。まず、関数呼び出しが完了するまでに時間がかかる場合は、非同期にする必要があります。次に、非同期にした場合、5分後にタイムアウトしません。
試してみてください:P
DateTime d = DateTime.Now;
Task t = new Task(() =>
{
log.Info("Doing long task");
for (int cnt = 0; cnt < 100; cnt++)
{
log.Info(DateTime.Now.Subtract(d).ToString());
System.Threading.Thread.Sleep(10000);
}
});
t.Start();
現在、私の投稿によると、消費プランで5分以上実行しています。タイムアウトがありますが、5分以上実行しているため、明らかに実行時間ではありません。タイムアウトは、関数を実行する呼び出しメカニズムにあります。非同期にすると、呼び出し元が戻り、関数は実行を継続します。長時間実行されるタスクを、呼び出し元のスレッド/プロセスとは別のスレッド/プロセスに配置するのが一般的な方法です。関数プラットフォームのオーケストレーションレイヤーが長期間ブロックされないようにすることは理にかなっています。プラットフォームを大幅に劣化させるため、長時間実行される関数の呼び出し層をブロックしないでください。