web-dev-qa-db-ja.com

Azure Functionsはどのようにスケールアウトしますか?

Azure Functionsのスケーリングドキュメント は、AzureFunctionsがアプリのインスタンスを追加するタイミングを決定する方法の詳細について少し説明しています。

たとえば、GithubWebhookによってトリガーされる関数があるとします。 10,000人が同時にGithubリポジトリにコミットし(マージの競合はありません;))、Githubは非常に短い時間で私の関数を10,000回呼び出します。

何が起こると期待できますか?具体的には、

  1. Azure FunctionsはWebhook呼び出しを抑制しますか?つまり、関数アプリの負荷が高い場合、Azure Functionsは特定の関数呼び出しを拒否しますか?
  2. Azure Functionsは何らかの方法で要求をキューに入れますか?もしそうなら、どこで/どのように?
  3. このシナリオでは、Azure Functionsが作成する関数アプリのインスタンスはいくつですか?リクエストごとに1つ(つまり、10,000)、それぞれが並行して実行されますか?
  4. アプリの関数がゼロインスタンスに縮小された場合、負荷がなかったため、最初の関数が実行される前に「ウォームアップ時間」が発生することが予想されますか?おおよそどのくらいですか?
26
Adrian Hofman
  1. Azure FunctionsはWebhook呼び出しを拒否しませんが、突然の極端な負荷の場合、一部の要求がタイムアウトすることがあります。 Web APIの場合、ベストプラクティスとして、クライアントでの再試行を含めてください。
  2. それらは永続的な場所でキューに入れられません。それらは(実装の詳細)IISによって管理されます。
  3. (実装の詳細)インスタンスの数は難しい設定ではありません。未公開の特定の保護がありますが、かなり拡張できるように設計されています。リクエストは複数のインスタンスによって処理されます。
  4. はい。今のところかなり重い(秒)ですが、改善に取り組んでいきます。パフォーマンスに敏感な状況では、カナリアまたはタイマートリガーを使用して、目を覚まし続けることをお勧めします。

私はAzureFunctionsチームの出身です。私が実装の詳細としてマークしたことは約束ではなく、サービスを進化させるにつれて変わる可能性があります。透明性の試みにすぎません。

23
  1. 今日テストされました。数秒以上かかりました:(
ACTUAL PERFORMANCE
--------------
ClientConnected:  13:58:41.589

ClientBeginRequest:   13:58:41.592

GotRequestHeaders:    13:58:41.592

ClientDoneRequest:    13:58:41.592

Determine Gateway:    0ms

DNS Lookup:       65ms

TCP/IP Connect:   40ms

HTTPS Handshake:  114ms

ServerConnected:  13:58:41.703

FiddlerBeginRequest:  13:58:41.816

ServerGotRequest: 13:58:41.817

ServerBeginResponse:  14:00:36.790

GotResponseHeaders:   14:00:36.790

ServerDoneResponse:   14:00:36.790

ClientBeginResponse:  14:00:36.790

ClientDoneResponse:   14:00:36.790


Overall Elapsed:  **0:01:55.198**
5
NoWhereToBeSeen