簡體   English   中英

AWS Java Lambda局部變量vs對象變量

[英]AWS Java Lambda local variables vs object variables

我試圖找到一個非常具體的問題的答案。 試圖通過文檔,但到目前為止沒有運氣。

想象一下這段代碼

@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<>();
}

這里,我將orderIdstoreId存儲在field變量中。 這個可以嗎? 我不確定AWS是否會緩存此函數並因此緩存字段變量,或者它是否會為每個請求啟動一個新的Java對象。 如果它是一個新對象,那么存儲在字段變量中很好但不確定。

AWS將啟動JVM並在第一個請求時實例化您的代碼實例。 AWS具有未記錄的停機時間,如果您在此時間限制內未再次調用Lambda,則會關閉JVM。 您會注意到這些初始請求可能會花費更長的時間,但是一旦您的功能“預熱”,它就會快得多。

因此,要直接回答您的問題,如果下一個請求足夠快,您的實例將被重用。 否則,將會出現一個新實例。

一個簡單的Lambda函數可以說明這一點:

/**
 * 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

強烈不推薦。

多次調用可能使用相同的Lambda函數實例,這將破壞您當前的功能。

您需要確保您的實例變量是線程安全的,並且在涉及Lambda時可以由多個線程訪問。 將實例變量寫入初始化限制 - 僅限一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM