web-dev-qa-db-ja.com

AWS lambdaおよびJava同時実行性

AWS lambda mayハンドラーの初期に作成されたオブジェクトを再利用することがわかっており、実際にそれを行います( [〜#〜] faq [〜#〜] を参照)。

Q:AWS Lambdaは関数インスタンスを再利用しますか?

パフォーマンスを改善するために、AWS Lambdaは、新しいコピーを作成するのではなく、関数のインスタンスを保持し、それを再利用して後続のリクエストを処理することを選択できます。あなたのコードは、これが常に起こると仮定すべきではありません。


問題は、Java同時実行性に関するものです。ハンドラーのクラスがある場合、次のように言います。

public class MyHandler {
    private Foo foo;
    public void handler(Map<String,String> request, Context context) {
       ...
    }
}

ここで、オブジェクト変数fooにアクセスして作業することはスレッドセーフですか?

言い換えると、AWS lambdaは異なるオブジェクトの呼び出しに同じオブジェクトを同時に使用できますか?

[〜#〜] edit [〜#〜]関数はイベントベースのソースで処理されます。特に、API Gatewayメソッドによって呼び出されます。

EDIT-2この種の質問は、外部リソースへの何らかの接続プールを実装するときに発生するため、外部への接続を維持したいオブジェクト変数としてのリソース。実際には望みどおりに動作しますが、同時実行の問題が怖いです。

EDIT-3より具体的には疑問に思っています:AWS lambdaのハンドラーのインスタンスは共通のヒープ(メモリ)を共有できますかどうか? Javaスレッドセーフオブジェクトについての明白で一般的なもののリストで答えを防ぐために、この追加の詳細を指定する必要があります。

39
Andremoniy

AWS lambdaは、異なる呼び出しに対して同じオブジェクトを同時に使用できますか?

AWS lambdaのハンドラーのインスタンスは、共通のヒープ(メモリ)を共有できますか?

強く、明確なNO。 AWS Lambdaのハンドラーのインスタンスは、ファイルを共有することさえできません(/tmp)。

AWS Lambdaコンテナはnotが存在するLambda関数の2つ以上の同時実行された呼び出しに再利用できます。

Q:AWS Lambdaはどのようにコードを分離しますか?

各AWS Lambda関数は、独自のリソースとファイルシステムビューで独自の分離環境でを実行します。

ラムダ関数の仕組み の公式説明のセクション"AWS Lambdaはどのようにコードを実行しますか?コンテナモデル"の状態:

Lambda関数が実行された後、AWS Lambdaは、別のLambda関数の呼び出しを見越して、しばらくコンテナを維持します。実際、AWS LambdaがLambda関数が再度呼び出されたときにコンテナを再利用することを選択した場合、Lambda関数が完了した後、サービスはコンテナをフリーズし、再利用のためにコンテナを解凍します。このコンテナ再利用アプローチには、次の意味があります。

  • Lambda関数コード内の宣言は初期化されたままで、関数が再度呼び出されたときに追加の最適化を提供します。 たとえば、Lambda関数がデータベース接続を確立する場合、接続を再確立する代わりに、元の接続が後続の呼び出しで使用されます。コードにロジックを追加して、接続を作成する前に接続が既に存在するかどうかを確認できます。

  • 各コンテナは、/ tmpディレクトリにディスク領域を提供します。コンテナを凍結してもディレクトリの内容は保持され、複数の呼び出しに使用できる一時的なキャッシュが提供されます。追加のコードを追加して、保存したデータがキャッシュにあるかどうかを確認できます。

  • AWS Lambdaがコンテナの再利用を選択した場合、関数が終了したときに完了しなかったLambda関数によって開始されたバックグラウンドプロセスまたはコールバックが再開します。コードが終了する前に、コード内のバックグラウンドプロセスまたはコールバック(Node.jsの場合)が完了していることを確認する必要があります。

ご覧のとおり、コンテナの再利用を利用しようとする場合、Lambda関数の複数の同時呼び出し間の競合状態に関する警告はまったくありません。唯一の注意は「それに依存しないでください!」です。

60
Leon

実行コンテキストの再利用を活用することは、AWS Lambdaを使用する際の確実なプラクティスです( AWS Lambda Best Practices を参照)。ただし、同時実行の場合、新しいコンテナが作成されるため、新しいコンテキストが作成されるため、これは同時実行には適用されません。つまり、同時実行の場合、1つのハンドラーが値を変更しても、他のハンドラーは新しい値を取得しません。

0
Farhan Haider