[英]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<>();
}
這里,我將orderId
和storeId
存儲在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.