람다 함수를 담는 자바 클래스
- 스태틱 변수
- 인스턴스 변수
- 함수 내 로컬 변수를 선언하고 랜덤 값을 대입한다.
public class DataTypes {
private Double instanceVariable = Math.random();
private static Double staticVariable = Math.random();
public DataTypes() {
System.out.println("--Constructor--");
}
static {
System.out.println("--Static Block--");
}
public void coldStartBasics() {
Double localVariable = Math.random();
System.out.println("Instance Varialbe: " + instanceVariable);
System.out.println("Static Varialbe: " + staticVariable);
System.out.println("Local Varialbe: " + localVariable);
}
}
람다 실행
aws cli를 사용하여 aws 람다 서비스에 올린 람다 함수를 호출해 본다. 예제코드의 람다는 반환이 없는 비동기 함수이므로 Event 호출 타입을 지정한다.
aws lambda invoke --invocation-type Event --function-name firstlambda-HelloWorldFunction-4ZhrC9E8dSTV outputfile.txt
람다 실행 로그
람다를 AWS 람다 서비스 위에 배치하고 3번 연속으로 빠르게 호출한다음 로그를 관찰한다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| timestamp | message |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1648104037706 | START RequestId: 90a66e7d-fadc-4217-be38-4ef868a583e3 Version: $LATEST |
| 1648104037711 | --Static Block-- |
| 1648104037711 | --Constructor-- |
| 1648104037911 | Instance Varialbe: 0.6080151463138963 |
| 1648104037911 | Static Varialbe: 0.7136244551101137 |
| 1648104037911 | Local Varialbe: 0.0536704951485133 |
| 1648104037934 | END RequestId: 90a66e7d-fadc-4217-be38-4ef868a583e3 |
| 1648104037934 | REPORT RequestId: 90a66e7d-fadc-4217-be38-4ef868a583e3 Duration: 212.96 ms Billed Duration: 213 ms Memory Size: 256 MB Max Memory Used: 77 MB Init Duration: 289.51 ms |
| 1648104054396 | START RequestId: 56a11a5e-b620-43c7-9a7a-09410cfd1d2f Version: $LATEST |
| 1648104054399 | Instance Varialbe: 0.6080151463138963 |
| 1648104054399 | Static Varialbe: 0.7136244551101137 |
| 1648104054399 | Local Varialbe: 0.10796181422090145 |
| 1648104054401 | END RequestId: 56a11a5e-b620-43c7-9a7a-09410cfd1d2f |
| 1648104054401 | REPORT RequestId: 56a11a5e-b620-43c7-9a7a-09410cfd1d2f Duration: 1.05 ms Billed Duration: 2 ms Memory Size: 256 MB Max Memory Used: 77 MB |
| 1648104055812 | START RequestId: f24f5986-16b9-47d0-b6a3-d3afdae016c8 Version: $LATEST |
| 1648104055816 | Instance Varialbe: 0.6080151463138963 |
| 1648104055816 | Static Varialbe: 0.7136244551101137 |
| 1648104055816 | Local Varialbe: 0.8577521456219314 |
| 1648104055818 | END RequestId: f24f5986-16b9-47d0-b6a3-d3afdae016c8 |
| 1648104055818 | REPORT RequestId: f24f5986-16b9-47d0-b6a3-d3afdae016c8 Duration: 1.23 ms Billed Duration: 2 ms Memory Size: 256 MB Max Memory Used: 77 MB |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
로그 해석
- 본인이 배치한 람다 함수에 대해 첫 호출이 발생하면 람다 서비스의 자바 런타임에 본인이 업로드한 람다 클래스가 부트스트랩 되고, 생성자가 호출되어 인스턴스화된다. 위 로그에서 --Static Block-- 과 --Constructor-- 가 나타난 시점을 확인해 보면 된다.
- 첫 호출 이후 짧은 시간내에 벌어지는 반복된 호출은 생성된 인스턴스를 그대로 사용한다. 따라서 static변수와 인스턴스 범위 변수들의 값이 3번의 호출마다 동일한 것을 볼 수 있다.
- 생성된 인스턴스가 얼마의 기간동안 유지될지는 문서화되어 있지 않다. 따라서 람다 클래스에 인스턴스 변수를 만들어 여기에 상태를 보관하는 일을 생각해선 안 된다. 프로그램을 신뢰할 수 없도록 만드는 행위이다.
람다 클래스의 수명 요약
- 람다를 “오랜만에” 호출할 시 클래스가 부트스트랩 되고, 인스턴스가 생성된다.
- 인스턴스는 특정되지 않은 시간동안 생존해 있으면서 이후에 발생되는 람다 호출에게 서비스를 해준다.
- 인스턴스가 언제 런타임에서 회수되는지, 런타임이 언제 람다 서비스에서 종료되는지 문서화되어 있지 않으므로 불명확하다. 따라서 인스턴스 변수와 스태틱 변수에는 상태를 저장하지 않아야 한다.
'컴퓨터공학 > 서버리스' 카테고리의 다른 글
[AWS][API Gateway] API Gateway 유형에 따른 ALB Private Integration 차이 /w VPC Link (2) | 2022.09.08 |
---|---|
[AWS][SAM] 오류 핸들링 (0) | 2022.04.04 |
[AWS][SAM][강의노트] 다양한 시그니처의 람다 작성해보기 (0) | 2022.03.11 |
[AWS][SAM][강의노트] sam init - 프로젝트 시작하기 (0) | 2022.03.11 |