[AWS][SAM][강의노트] 자바 런타임에서 람다 클래스의 수명

컴퓨터공학/서버리스

2022. 03. 24.

람다 함수를 담는 자바 클래스

  • 스태틱 변수
  • 인스턴스 변수
  • 함수 내 로컬 변수를 선언하고 랜덤 값을 대입한다.
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번의 호출마다 동일한 것을 볼 수 있다.
  • 생성된 인스턴스가 얼마의 기간동안 유지될지는 문서화되어 있지 않다. 따라서 람다 클래스에 인스턴스 변수를 만들어 여기에 상태를 보관하는 일을 생각해선 안 된다. 프로그램을 신뢰할 수 없도록 만드는 행위이다.

람다 클래스의 수명 요약

  • 람다를 “오랜만에” 호출할 시 클래스가 부트스트랩 되고, 인스턴스가 생성된다.
  • 인스턴스는 특정되지 않은 시간동안 생존해 있으면서 이후에 발생되는 람다 호출에게 서비스를 해준다.
  • 인스턴스가 언제 런타임에서 회수되는지, 런타임이 언제 람다 서비스에서 종료되는지 문서화되어 있지 않으므로 불명확하다. 따라서 인스턴스 변수와 스태틱 변수에는 상태를 저장하지 않아야 한다.