GraalVM + AWS Lambda or solving Java cold start problem
--
Do you also like Serverless and Java, but hate a Java code start? In this article, we are going to demonstrate how to solve Java cold start issue in AWS Lambda.
Let’s write some book microservice and measure the performance.
As usual all code you can see in my Github: https://github.com/Aleksandr-Filichkin/java-graalvm-aws-lambda
Our test architecture
API-Gateway -> AWS Lambda->DynamoDb
Version 1 (plain Java without improvements)
- Java 11
- AWS SDK-V2 for DynamoDB(extended DynamoDb client)
- No DI (Spring, Dagger, etc)
- No special frameworks
Code is here
https://github.com/Aleksandr-Filichkin/java-graalvm-aws-lambda/tree/main/lambda-v1
Our handler is:
Result:
REPORT RequestId: e89b743e-bf08–4c8a-9783–0772102d4e90 Duration: 10845.21 ms Billed Duration: 10846 ms Memory Size: 256 MB Max Memory Used: 168 MB Init Duration: 2650.86 ms
Version 2(plain Java with improvements)
- Java 11
- AWS SDK-V2 for Dynamodb
- No DI (Spring, etc)
- No special frameworks
- Utilize CPU burst on startup (move everything to static, warm-up dynamoDB client)
- Reduce dependencies(exclude Netty)
- Specify AWS Regions
- Specify Credential Provider
Code is here: https://github.com/Aleksandr-Filichkin/java-graalvm-aws-lambda/tree/main/lambda-v2
Handler: