私のプロジェクトには、REST AWS API GatewayとAWS Lambdaに実装されたAPIがあります。AWSLambda関数は呼び出し中にサーバーレスでステートレスであるため、AWSは AWS documentation ラムダ関数の実行が終了した後、AWSはコンテナを停止せず、そのコンテナで次の呼び出しを処理できます。このようなアプローチにより、サービスのパフォーマンスが向上します- AWSが最初の呼び出し時にのみコンテナを起動する時間を費やし(Lambda関数のコールドスタート)、次の呼び出しはすべて同じコンテナを使用するため(ウォームスタート)より高速に実行されます。
パフォーマンスを改善するための次のステップとして、定期的にLambda関数を呼び出すcronジョブを作成しました(そのためにCloudwatchルールを使用します)。このようなアプローチにより、Lambda関数を「ウォーム」に保ち、コンテナの停止と再起動を回避できます。つまり実際のユーザーがREST APIを呼び出す場合、Lambdaは新しいコンテナーを開始するために時間を費やしません。
しかし、私たちは問題に直面しました-このようなアプローチでは、Lambda関数の1つのコンテナーのみを暖かく保つことができますが、異なるユーザーからの並列呼び出しの実際の数ははるかに大きくなる可能性があります(この場合は数百、時には数千のユーザーです)。ラムダ関数のウォームアップ機能を実装する方法はありますか?これにより、単一のコンテナだけでなく、必要な数のコンテナを温めることができますか?
このようなアプローチはLambda関数の使用コストに影響を与える可能性があることを理解しており、おそらく古き良きアプリケーションサーバーを使用する方がよいでしょうが、これらのアプローチとそのコストの比較は次のステップになると思います。必要なLambda関数コンテナの数を温める方法を見つけたいだけです。
これは長くなる可能性がありますが、回避策を提供し、あなたがよりよく理解できるようになるかもしれないので、私と一緒に耐えてくださいLambdaの仕組み?
あるいは、読みたくない場合は、下にスキップ "回避策"を使用できます。
コールドスタートについて知らない人は、よりよく理解するために このブログ 投稿を読んでください。これを簡単に説明するには:
理解を深めるために、次のシナリオを検討してください。
今あなたが解決した問題の最初の部分を考え出す:
コールドスタートの防止に関しては、これは可能性です。ただし、保証されているわけではありません。一般的な回避策は、ラムダ関数の1つのコンテナのみを暖かく保つことです。そのためには、Lambda関数を数分ごとに呼び出して暖かく保つスケジュールイベント(cron式)を使用してCloudWatchイベントを実行します。
ユースケースでは、Lambda関数は非常に頻繁に呼び出されますと非常に高い同時実行率。できるだけ多くのコールドスタートを回避するには、最高の同時実行性に達すると予想される数のコンテナを暖かく保つ必要があります。これを行うには、この関数の同時実行性が構築され、望ましい同時実行の量に到達できるように遅延して関数を呼び出す必要があります。これにより、Lambdaは必要な数のコンテナーをスピンアップさせます。その結果、これによりコストが発生する可能性があり、コールドスタートを回避することは保証されません。
とはいえ、ここでは、機能のために複数のコンテナを一度に暖かく保つ方法の内訳を示します:
スケジュールでトリガーされるCloudWatchイベントルールが必要です。このスケジュールは、固定レートまたはcron式にすることができます。たとえば、5分ごとにトリガーするようにこのルールを設定できます。 次に、このルールのターゲットとしてLambda関数(コントローラー関数)を指定します。
Controller Lambda functionは、多くのLambda関数(暖かく保ちたい関数)を呼び出します必要に応じて同時実行コンテナ
ここで考慮すべきことがいくつかあります。
別の呼び出しが開始される前に最初の呼び出しが終了した場合、この呼び出しは以前の呼び出しコンテナーを再利用し、新しい呼び出しコンテナーを作成しないため、並行性を構築する必要があります。これを行うには、コントローラー関数によって関数が呼び出される場合、Lambda関数に何らかの遅延を追加する必要があります。 これは、これらの呼び出しで特定のペイロードを関数に渡すことで実行できます。暖かく保ちたいラムダ関数は、このペイロードが存在するかどうかを確認します。そうである場合、関数は(同時呼び出しを構築するために)待機し、そうでない場合、関数は期待どおりに実行できます。
また、繰り返し呼び出す場合は、Invoke Lambda API呼び出しでスロットルされないようにする必要があります。 Lambda関数は、このスロットルが発生した場合に処理するように記述し、API呼び出しの間に遅延を追加してスロットルを回避することを検討する必要があります。
最後にこのソリューションはコールドスタートを減らすことができますが、Lambdaでの作業時に避けられないため、コストが増加し、コールドスタートが発生することを保証しません。 Lambdaコールドスタートで発生する場合、EC2インスタンスでサーバーを使用することをお勧めします。
Java(スプリングブート)ラムダを使用しています。非常にうまく機能する上記のKush Vyasの答えとほぼ同じソリューションになりました。
しかし、負荷テスト中に、「コントローラー機能」の実行中に正当なユーザーリクエストが頻繁に発生し、再び避けられないコールドスタートが発生することがわかりました...
したがって、「コントローラー関数」では、通常の数のX同時ウォームアップ要求がありますが、関数の5回の実行ごとに、ターゲットラムダをさらに2回呼び出します。理論上は、X + 2のラムダがウォームのままになりますが、ウォームアップコールの5つのうち4つには、ユーザーの要求に対応できる2つの冗長なラムダが残っています。
コールドスタートの数はさらに減少しました(しかし、明らかに完全ではありません)。特定の状況の負荷要件。
AWS Lambdaで サーバーレスフレームワーク を使用する場合、この plugin を使用して、すべてのラムダを一定レベルの並行性で暖かく保つことができます。
コールドスタートに関連する「ユーザーによる監視」遅延を減らすために使用する、小さいながらも役立つヒントを共有したいと思います。この場合、Lambda関数はAWS API Gatewayを介してフロントエンドからのHTTPリクエストを処理し、特にユーザーが入力フィールドに何かを入力すると検索機能を実行します。通常、ユーザーはUIがレンダリングされてから少し遅れて入力を開始するため、Lambda関数のping呼び出しを実行してウォームアップします。そして、ユーザーがバックエンドにリクエストを送信すると、ほとんどの場合、Lambdaは作業の準備が整います。
実際には、このようなアプローチはバックエンド側のコールドスタートの問題を修正するために何も行いません。修正方法は他のオプションを探す必要があります。
覚えておくべきことの1つ-サービスが公開されており、Google Insightsのスコアに関心がある場合は、そのようなアプローチを慎重に実装する必要があります。