2017-06-07 3 views
1

私は非常に特定の質問に対する答えを見つけようとしています。 documentationを通過しようとしていますが、これまで運がありません。AWS Javaラムダローカル変数対オブジェクト変数

コード

ここ
@Override 
public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException { 
    Request request = parseRequest(input); 

    List<String> validationErrors = validate(request); 

    if (validationErrors.size() == 0){ 
     ordersManager.getOrderStatusForStore(orderId, storeId); 
    } else { 
     generateBadRequestResponse(output, "Invalid Request", null); 
    } 
} 

private List<String> validate(Request request) { 
    orderId = request.getPathParameters().get(PATH_PARAM_ORDER_ID); 
    programId = request.getPathParameters().get(PATH_PARAM_STORE_ID); 
    return new ArrayList<>(); 
} 

のこの作品を想像して、私はfield変数でorderIdstoreIdを格納しています。これは大丈夫ですか? AWSがこの関数をキャッシュしてフィールド変数をキャッシュするか、すべてのリクエストに対して新しいJavaオブジェクトを開始するかどうかはわかりません。その新しいオブジェクトの場合、フィールド変数に格納するのは問題ありませんが、わかりません。

答えて

2

AWSはJVMをスピンアップし、最初のリクエストでコードのインスタンスをインスタンス化します。 AWSには文書化されていないスピンダウン時間があります。この制限時間内にラムダを再起動しないと、JVMがシャットダウンします。これらの最初のリクエストにはかなりの時間がかかりますが、機能が「ウォームアップ」されると、はるかに速くなります。

あなたの質問に直接答えるために、次のリクエストが十分に早く到着した場合、インスタンスが再利用されます。それ以外の場合は、新しいインスタンスが立ち上がります。この点を説明することができる

A単純なラムダ関数:上記の呼び出しから

/** 
* A Lambda handler to see where this runs and when instances are reused. 
*/ 
public class LambdaStatus { 

    private String hostname; 
    private AtomicLong counter; 

    public LambdaStatus() throws UnknownHostException { 
     this.counter = new AtomicLong(0L); 
     this.hostname = InetAddress.getLocalHost().getCanonicalHostName(); 
    } 

    public void handle(Context context) { 
     counter.getAndIncrement(); 
     context.getLogger().log("hostname=" + hostname + ",counter=" + counter.get()); 
    } 
} 

ログ。

22:49:20 hostname=ip-10-12-169-156.ec2.internal,counter=1 
22:49:27 hostname=ip-10-12-169-156.ec2.internal,counter=2 
22:49:39 hostname=ip-10-12-169-156.ec2.internal,counter=3 
01:19:05 hostname=ip-10-33-101-18.ec2.internal,counter=1 
0

強くおすすめしません。

複数の呼び出しで同じラムダ関数インスタンスを使用する可能性があり、これにより現在の機能が中断されます。

インスタンス変数がスレッドセーフであり、ラムダに関しては複数のスレッドからアクセスできるようにする必要があります。インスタンス変数の書き込みを初期化に制限する - 一度だけ。

関連する問題