SlideShare a Scribd company logo
Adopting Java for the
Serverless world
from the perspective of the AWS developer
Vadym Kazulkin, ip.labs, JUG Hessen, 28 April 2022
Contact
Vadym Kazulkin
ip.labs GmbH Bonn, Germany
Co-Organizer of the Java User Group Bonn
v.kazulkin@gmail.com
@VKazulkin
https://www.linkedin.com/in/vadymkazulkin
https://www.iplabs.de/
ip.labs
https://www.iplabs.de/
Java popularity
https://redmonk.com/rstephens/2021/08/05/top-20-june-2021/ Vadym Kazulkin @VKazulkin , ip.labs GmbH
https://www.cleveroad.com/blog/programming-languages-ranking Vadym Kazulkin @VKazulkin , ip.labs GmbH
AWS and Serverless
2020 Magic Quadrant for Cloud Infrastructure & Platform Services
https://pages.awscloud.com/GLOBAL-multi-DL-gartner-mq-cips-2020-learn.html?pg=LWIAWS
https://aws.amazon.com/de/resources/analyst-reports/gartner-mq-cips-2021/
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Vadym Kazulkin @VKazulkin , ip.labs GmbH
“State of Serverless 2020 report” https://codingsans.com/blog/serverless-trends
The State of Serverless 2021
https://www.datadoghq.com/state-of-serverless/
Vadym Kazulkin @VKazulkin , ip.labs GmbH
The State of Serverless 2021
https://www.datadoghq.com/state-of-serverless/
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Life of the Java Serverless developer on
AWS
AWS Java Versions Support
• Java 8
• With extended long-term support
• Java 11 (since 2019)
• Only Long Term Support (LTS) by AWS
• Current LTS Java version is Java 17
• Amazon Corrett Support for 17 is released, but not currently available for
Lambda
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: https://aws.amazon.com/de/corretto/
Java ist very fast
and mature
programming
language…
Image: burst.shopify.com/photos/a-look-across-the-landscape-with-view-of-the-sea
… but Serverless
adoption of Java
looks like this
Vadym Kazulkin @VKazulkin , ip.labs GmbH
2020 AWS Lambda Benchmark Report for Developers, DevOps, and Decision Makers
https://newrelic.com/resources/ebooks/serverless-benchmark-report-aws-lambda-2020
Vadym Kazulkin @VKazulkin , ip.labs GmbH
The State of Serverless 2021
https://www.datadoghq.com/state-of-serverless/
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Developers love Java and will be happy
to use it for Serverless
But what are the challenges
Vadym Kazulkin @VKazulkin , ip.labs GmbH
AWS Lambda Basics
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Creating AWS Lambda with Java 1/3
:
Source https://blog.runscope.com/posts/how-to-write-your-first-aws-lambda-function
Creating AWS Lambda with Java 2/3
:
Source https://blog.runscope.com/posts/how-to-write-your-first-aws-lambda-function
Creating AWS Lambda with Java 3/3
:
Source https://docs.aws.amazon.com/lambda/latest/dg/java-context.html
AWS Lambda Price Model
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Cost for Lambda
REQUEST DURATION
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Request Tier
$ 0.20
Per 1 Mio Requests
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Duration Tier
$ 0.00001667 (x86)
$ 0.00001333 (Arm)
Per GB-Second
Vadym Kazulkin @VKazulkin , ip.labs GmbH
GB-Second
ONE SECOND ONE GB
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Example
• 1 Mio requests
• Lambda x86 with 512MiB
• Each lambda takes 200ms
0.5 GiB * 0.2 sec * 1 Mio
= 100 000 GB-Seconds
Requests:
$0.20
GB-Seconds:
$1.67
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Challenge Number 1 with Java is a
big cold-start
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: https://www.serverless.com/blog/keep-your-lambdas-warm
Cold Start
:
Sources: Ajay Nair „Become a Serverless Black Belt” https://www.youtube.com/watch?v=oQFORsso2go
Tomasz Łakomy "Notes from Optimizing Lambda Performance for Your Serverless Applications“ https://tlakomy.com/optimizing-lambda-performance-for-serverless-applications
• Start Firecracker VM
• AWS Lambda starts the JVM
• Java runtime loads and initializes
handler class
• Static initializer block of the handler class is
executed
• Init-phase has full CPU access up to 10 seconds for
free for the managed execution environments
• Lambda calls the handler method
• Full CPU access only approx. at 1.8 GB “assigned”
memory to the function
Sources: Ajay Nair „Become a Serverless Black Belt” https://www.youtube.com/watch?v=oQFORsso2go
Tomasz Łakomy "Notes from Optimizing Lambda Performance for Your Serverless Applications“ https://tlakomy.com/optimizing-lambda-performance-for-serverless-applications
Michael Hart: „Shave 99.93% off your Lambda bill with this one weird trick“ https://hichaelmart.medium.com/shave-99-93-off-your-lambda-bill-with-this-one-weird-trick-33c0acebb2ea
Function lifecycle- a full cold start
Sources: Ajay Nair „Become a Serverless Black Belt” https://www.youtube.com/watch?v=oQFORsso2go
Tomasz Łakomy "Notes from Optimizing Lambda Performance for Your Serverless Applications“ https://tlakomy.com/optimizing-lambda-performance-for-serverless-applications
AWS Lambda cold start duration
per programming language
Source: Mikhail Shilkov: „AWS Lambda: Cold Start Duration per Language. 2020 edition” https://mikhail.io/serverless/coldstarts/aws/languages/
Cold start duration with Java
• Below 1 second is best-case cold start duration for very simple Lambda
like HelloWorld with no dependencies
• It goes up significantly with more complex scenarios
• Instantiation outside of the handler method (static initializer block) to
communicate with other (AWS) services (e.g. DynamoDB, SNS, SQS, 3rd party)
• Artifact size
Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/
AWS Lambda cold starts by memory size,
runtime and artifact size
Source: Mike Roberts "Analyzing Cold Start latency of AWS Lambda" https://blog.symphonia.io/posts/2020-06-30_analyzing_cold_start_latency_of_aws_lambda
Artifact Size:
• Small zip (1KB)
• Large zip (48MB)
• Large uberjar (53MB)
Cold start duration with Java
• Below 1 second is best-case cold start duration for very simple Lambda
like HelloWorld with no dependencies
• It goes up significantly with more complex scenarios
• Instantiation outside of the handler method (static instantiation) to communicate
with other (AWS) services (i.e. DynamoDB, SNS, SQS, 3rd party)
• Artifact size
• To minimize the cold start time apply best practices from this talk
• Worst-case cold starts can be higher than 10 and even 20 seconds
Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/
Best Practices and Recommendations
Using Tiered Compilation
• Achieve up to 60% faster startup times can use level 1 compilation with
little risk of reducing warm start performance
Mark Sailes: "Optimizing AWS Lambda function performance for Java”
https://aws.amazon.com/de/blogs/compute/optimizing-aws-lambda-function-performance-for-java/
• Switch to the AWS SDK 2.0 for Java
• Lower footprint and more modular
• Allows to configure HTTP Client of your choice (i.e. Java own Basic HTTP Client or
newly introduced AWS Common Runtime async HTTP Client)
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
Zoe Wang: „Introducing AWS Common Runtime HTTP Client in the AWS SDK for Java 2.x”
https://aws.amazon.com/de/blogs/developer/introducing-aws-common-runtime-http-client-in-the-aws-sdk-for-java-2-x/
S3AsyncClient.builder()
.httpClientBuilder(AwsCrtAsyncHttpClient.builder()
.maxConcurrency(50))
.build();
Best Practices and Recommendations
Provide all known values (for building clients i.e. DynamoDB client) to
avoid auto-discovery
• credential provider, region, endpoint
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(Regions.US_WEST_2)
.withCredentials(new ProfileCredentialsProvider("myProfile"))
.build();
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/
Best Practices and Recommendations
• Initialize dependencies during initialization phase
• Use static initialization in the handler class, instead of in the handler method (e.g.
handleRequest) to take the advantage of the access to the full CPU core for max 10 seconds
• In case of DynamoDB client put the following code outside of the handler method:
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()...build();
DynamoDB dynamoDB = new DynamoDB(client);
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/
Best Practices and Recommendations
• Less (dependencies, classes) is more
• Include only required dependencies (e.g. not the whole AWS SDK 2.0 for Java, but the
dependencies to the clients to be used in Lambda)
• Exclude dependencies, which you don‘t need at runtime e.g. test frameworks like Junit
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/
https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb</artifactId>
<version>2.10.86</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.10.86</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Best Practices and Recommendations
Avoid:
• reflection
• runtime byte code generation
• runtime generated proxies
• dynamic class loading
Use DI Frameworks like Micronaut, Quarkus or Dagger which aren‘t
reflection-based
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/
Best Practices and Recommendations
Strive for cost optimization
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Best Practices and Recommendations
Cost for Lambda
REQUEST DURATION
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Cost scales
linearly with
memory
Vadym Kazulkin @VKazulkin , ip.labs GmbH
More memory = more expensive?
Kazulkin @VKazulkin , ip.labs GmbH
Tooling for AWS Lambda in Java
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Lambda Power Tuning 1/2
• Executes different
settings in parallel
• Outputs the optimal
setting
Image: https://github.com/alexcasalboni/aws-lambda-power-tuning Vadym Kazulkin @VKazulkin , ip.labs GmbH
Lambda Power Tuning 2/2
• Executes different
settings in parallel
• Outputs the optimal
setting
Image: https://github.com/alexcasalboni/aws-lambda-power-tuning
Alex Casalboni: “Deep dive: finding the optimal resources allocation for your Lambda functions“
https://dev.to/aws/deep-dive-finding-the-optimal-resources-allocation-for-your-lambda-functions-35a6
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Optimizing AWS Lambda cost and
performance using AWS Compute
Optimizer
Source: Chad Schmutzer „Optimizing AWS Lambda cost and performance using AWS Compute Optimizer”
https://aws.amazon.com/de/blogs/compute/optimizing-aws-lambda-cost-and-performance-using-aws-compute-optimizer/
AWS Lambda
Powertools Java 1/3
https://aws.amazon.com/de/blogs/opensource/simplifying-serverless-best-practices-with-aws-lambda-powertools-java/
AWS Lambda
Powertools Java 2/3
https://aws.amazon.com/de/blogs/opensource/simplifying-serverless-best-practices-with-aws-lambda-powertools-java/
When using different Java
annotations provided by the
library, configure the
aspectj-maven-plugin to
compile-time weave the
aws-lambda-powertools-java
aspects into your project.
AWS Lambda
Powertools Java 3/3
https://aws.amazon.com/de/blogs/opensource/simplifying-serverless-best-practices-with-aws-lambda-powertools-java/
AWS Lambda Java Libs
https://github.com/aws/aws-lambda-java-libs
Cost optimization
• Java is well optimized for long running server applications
• High startup times
• High memory utilization
Vadym Kazulkin @VKazulkin , ip.labs GmbH
And both memory and execution time are cost dimensions,
when using Serverless in the cloud
GraalVM enters the scene
Source: https://www.graalvm.org/
GraalVM
Goals:
Low footprint ahead-of-time mode for JVM-based languages
High performance for all languages
Convenient language interoperability and polyglot tooling
Source: „Everything you need to know about GraalVM by Oleg Šelajev & Thomas Wuerthinger” https://www.youtube.com/watch?v=ANN9rxYo5Hg
GraalVM
Architecture
Sources: Practical Partial Evaluation for High-Performance Dynamic Language Runtimes http://chrisseaton.com/rubytruffle/pldi17-truffle/pldi17-truffle.pdf
„The LLVM Compiler Infrastructure“ https://llvm.org/
SubstrateVM
Source: Oleg Šelajev, Thomas Wuerthinger, Oracle: “Deep dive into using GraalVM for Java and JavaScript”
https://www.youtube.com/watch?v=a-XEZobXspo
GraalVM on SubstrateVM
A game changer for Java & Serverless?
Java Function compiled into a native executable using
GraalVM on SubstrateVM reduces
• “cold start” times
• memory footprint
by order of magnitude compared to running on JVM.
And both memory and execution time are cost dimensions,
when using Serverless in the cloud
GraalVM on SubstrateVM
A game changer for Java & Serverless?
Current challenges with native executable using GraalVM :
• Most Cloud Providers (AWS) doesn’t provide GraalVM as Java
Runtime out of the box, only Open JDK (i.e. AWS provides
Corretto)
• Some Cloud Providers (e.g. AWS) provide Custom Runtime
Option
Lambda Layers
& Lambda
Runtime API
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Custom Lambda Runtimes
GraalVM Complitation Modes
Source: „Everything you need to know about GraalVM by Oleg Šelajev & Thomas Wuerthinger” https://www.youtube.com/watch?v=ANN9rxYo5Hg
AOT vs JIT
Source: „Everything you need to know about GraalVM by Oleg Šelajev & Thomas Wuerthinger” https://www.youtube.com/watch?v=ANN9rxYo5Hg
GraalVM Native Cold Start 2021
Source: Aleksandr Filichkin: "AWS Lambda battle 2021: performance comparison for all languages (cold and warm start)“
https://filia-aleks.medium.com/aws-lambda-battle-2021-performance-comparison-for-all-languages-c1b441005fd1
Support of GraalVM native images in
Frameworks
Spring Framework: GraalVM native image support in Beta without
requiring additional configuration
Spring Boot: Ongoing work on experimental Spring Graal Native
project.
Quarkus: a Kubernetes Native Java framework developed by Red
Hat tailored for GraalVM and HotSpot, crafted from best-of-breed
Java libraries and standards.
Micronaut: a modern, JVM-based, full-stack framework for building
modular, easily testable microservice and serverless applications.
Common principles for all Frameworks
• Rely on as little reflection as possible
• Avoid runtime byte code generation, runtime generated proxies and
dynamic class loading as much as possible
• Process annotations at compile time
• Compatible with Spring‘s annotations
• The common goals:
• increase developer productivity
• speed up start up times and decrease memory usage for Microservice and
Serverless Java applications
• with and without usage of GraalVM and native image
Steps to deploy to AWS
• Installation prerequisites
• Framework of your choice (Micronaut, Quarkus, Spring)
• GraalVM and Native Image
• Apache Maven or Gradle
• AWS CLI and AWS SAM CLI (or SAM local for local testing)
• Build Linux executable of your application with GraalVM native-image
• Use Maven or Gradle plugin (if available)
• Deploy Linux executable as AWS Lambda Custom Runtime
• Function.zip with bootstrap Linux executable
Vadym Kazulkin @VKazulkin , ip.labs GmbH
AWS Lambda Deployment of Custom
Runtime with SAM
Source: https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store
Example
Source: https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store
Micronaut Framework
Source: https://micronaut.io/
Micronaut Additional Features
• Custom Validators
• AWS API Gateway integration
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store
Micronaut® AOT: build-time optimizations
for Micronaut applications
Micronaut AOT is an extension to the Micronaut Framework which is the
foundation to many optimizations that can be implemented at build time
but weren’t possible solely with annotation processing.
By effectively analyzing the deployment environment, AOT is capable of
reducing startup times or distribution size for both native and JVM
deliverables.
Source: “Introducing Micronaut® AOT: build-time optimizations for your Micronaut applications”
https://medium.com/graalvm/introducing-micronaut-aot-build-time-optimizations-for-your-micronaut-applications-68b8f1302c5
Build GraalVM Native Image with
Micronaut Framework
Maven plugin available since Micronaut 2.2 for building
GraalVM Native Image
./mvnw package -Dpackaging=native-image
Docker
./mvnw mn:dockerfile -Dpackaging=docker
Docker Native Image
./mvnw mn:dockerfile -Dpackaging=docker-native
Source: “What's new for Maven users in Micronaut 2.2” : https://micronaut.io/blog/2020-11-23-whats-new-maven.html
Quarkus
Source: https://quarkus.io/
Build GraalVM Native Image with Quarkus
mvn –Pnative package
Quarkus Additional Features
• Website for creating the App
• AWS API Gateway integration
• Eclipse MicroProfile compatible
• Funqy for multi cloud solutions
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
Quarkus Fanqy
Source: https://quarkus.io/guides/funqy
Quarkus-Fanqy AWS Serverless Support
• AWS Lambda
• AWS API Gateway
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: https://quarkus.io/guides/funqy-amazon-lambda-http
Spring (Boot) Framework
Source: https://spring.io/
Spring GraalVM Native Project
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: https://github.com/spring-projects-experimental/spring-native
Build GraalVM Native Image with Spring
Framework
mvn –Pnative package
Framework Comparison 1/2
• Project Initializer
• Programming Model
• Database Support
• Test Support
• Standards Support (i.e. MicroProfile)
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: „Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! by Michel Schudel“
https://www.youtube.com/watch?v=hnEXOqcNXPs
„Micronaut 2.0 vs Quarkus 1.3.1 vs Spring Boot 2.3 Performance on JDK 14“ https://www.youtube.com/watch?v=rJFgdFIs_k8
„Java EE, Jakarta EE, MicroProfile, or Maybe All of Them” https://www.eclipse.org/community/eclipse_newsletter/2019/february/Jakarta_Micro_All.php
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: „Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! by Michel Schudel“
https://www.youtube.com/watch?v=hnEXOqcNXPs
„Micronaut 2.0 vs Quarkus 1.3.1 vs Spring Boot 2.3 Performance on JDK 14“ https://www.youtube.com/watch?v=rJFgdFIs_k8
• Native Image with GraalVM
• Build time
• Framework compile-time activities
• GraalV Native Image compilation time
• Native Image Size
• (Cold) Startup Time
• Request/Invocation duration
• Memory Consumption
• Plain
• Application Size
• (Cold) Start Time
• Request/Invocation duration
• Memory Consumption
Framework Comparison 2/2
Lambda demo with common Java
application frameworks
Vadym Kazulkin @VKazulkin , ip.labs GmbH
https://github.com/aws-samples/serverless-java-frameworks-samples
Lambda Container Image Support
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: „https://aws.amazon.com/de/blogs/aws/new-for-aws-lambda-container-image-support/
Lambda Container Image Support
Use Cases:
• What about the support of the current Java version?
• Only Long Term Support (LTS) by AWS
• Java 8, Java 11, Java 17 (not for Lambda)
• Use Container (Docker) Image with i.e. Java 18
• GraalVM without Native Image may be faster
than OpenJDK for your application
• Use Container (Docker) Image with GraalVM
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: https://aws.amazon.com/de/corretto/
https://renaissance.dev/
Conclusion 1/2
• GraalVM and Frameworks are really powerful with a lot of potential
• Micronaut and Quarkus will improve the cold starts of Java
applications significantly even without GraalVM and native image
• They use as little as possible reflection and other runtime optimizations
• Cold start duration will still be in the range of maximal single digit (e.g. 1.5) seconds
depending on your application and framework
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Source: „https://stackoverflow.com/questions/63328298/how-do-you-debug-a-no-instances-of-are-allowed-in-the-image-heap-when-buil
Conclusion 2/2
• But the combination of discussed frameworks with GraalVM and Native
Image currently not without challenges
• AWS Lambda Custom Runtime requires Linux executable only
• Managing Custom Runtime requires some additional effort
• You pay for the init-phase of the function packaged as AWS Lambda Custom Runtime
• Init-phase is free for the managed runtimes like Java 8 and Java 11
• Reduce cold starts to several hundred milliseconds and very low memory consumption
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Personal Recommendations (highly opinionated)
• By default use plain Java Long Term Support Version with Amazon Corretto and (in
case you need it additionally) your favourite Framework (Micronaut, Quarkus)
• If your function needs constantly low response times for the known period of time ?
• Use Provisioned Concurrency additionally
• If your function needs constantly low response time and low cost is a requirement?
• Use GraalVM Native Image with your favourite Framework (Micronaut, Quarkus, Spring Boot
GraalVM Native) and AWS Lambda Custom Runtime
• Consider refactoring costs in your TCO calculation
• If you don‘t want to miss 3 years of innovation and use the newest Java Version?
• Use Lambda Container Image Support
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Try it yourselves
• Micronaut
• https://github.com/micronaut-guides/micronaut-function-aws-lambda
• Quarkus
• https://github.com/JosemyDuarte/quarkus-terraform-lambda-demo/tree/dynamo-
terraform
• Spring Native
• https://github.com/spring-projects-experimental/spring-native/tree/main/samples/cloud-
function-aws
• Misc examples with all frameworks
• https://github.com/awslabs/aws-serverless-java-container/tree/master/samples
Vadym Kazulkin @VKazulkin , ip.labs GmbH
Adopting Java for the Serverless World at JUG Hessen 2022
www.iplabs.de
Accelerate Your Photo Business
Get in Touch

More Related Content

PPTX
Using Jenkins and Jmeter to build a scalable Load Testing solution
PPSX
Exception Handling
PDF
Using advanced options in MariaDB Connector/J
PPT
Java database connectivity
PPTX
History of java'
PPT
C sharp
PPT
Introduction to Java Programming, Basic Structure, variables Data type, input...
PPT
Selenium ppt
Using Jenkins and Jmeter to build a scalable Load Testing solution
Exception Handling
Using advanced options in MariaDB Connector/J
Java database connectivity
History of java'
C sharp
Introduction to Java Programming, Basic Structure, variables Data type, input...
Selenium ppt

What's hot (20)

PPT
Test automation process
PDF
Jmeter Walkthrough
PPTX
Selenium introduction
PPTX
Hosting a website on IIS Server
PDF
NextJS, A JavaScript Framework for building next generation SPA
PPT
C#.NET
PPTX
Introduction to spring boot
PPTX
PDF
Java Tutorial | Java Programming Tutorial | Java Basics | Java Training | Edu...
PPTX
C++ vs C#
PPTX
oops concept in java | object oriented programming in java
PDF
Spring boot introduction
PPTX
QSpiders - Jdk Jvm Jre and Jit
PPTX
Kafka + Uber- The World’s Realtime Transit Infrastructure, Aaron Schildkrout
PPTX
Basic Algorithm @PPSC(1)
ODP
Garbage collection
PPTX
Katalon Recorder Web Automation.pptx
PDF
Basic i/o & file handling in java
PDF
Java exception handling ppt
PDF
How to go about testing in React?
Test automation process
Jmeter Walkthrough
Selenium introduction
Hosting a website on IIS Server
NextJS, A JavaScript Framework for building next generation SPA
C#.NET
Introduction to spring boot
Java Tutorial | Java Programming Tutorial | Java Basics | Java Training | Edu...
C++ vs C#
oops concept in java | object oriented programming in java
Spring boot introduction
QSpiders - Jdk Jvm Jre and Jit
Kafka + Uber- The World’s Realtime Transit Infrastructure, Aaron Schildkrout
Basic Algorithm @PPSC(1)
Garbage collection
Katalon Recorder Web Automation.pptx
Basic i/o & file handling in java
Java exception handling ppt
How to go about testing in React?
Ad

Similar to Adopting Java for the Serverless World at JUG Hessen 2022 (20)

PDF
Adopting Java for the Serverless World at JUG Darmstadt 2022
PDF
Adopting Java for the Serverless World at JUG Bonn 2022
PDF
Adopting Java for the Serverless world at AWS User Group Pretoria
PPTX
Adopting Java for the Serverless World at JAX 2022
PDF
Adopting Java for the Serverless world at JUG London
PDF
Adopting Java for the Serverless world at Serverless Meetup Singapore
PDF
Adopting Java for the Serverless World at VoxxedDays Luxemburg
PDF
Adopting Java for the Serverless world at IT Tage
PDF
Adopting Java for the Serverless world at Serverless Meetup Italy
PDF
Adopting Java for the Serverless world at Serverless Meetup New York and Boston
PDF
Adopting Java for the Serverless World at Voxxed Days Bruxelles 2023
PDF
Adapting Java for the Serverless World at JUG Barcelona
PDF
Adopting Java for the Serverless world at JUG Hamburg
PDF
How to reduce cold starts for Java Serverless applications in AWS at Serverle...
PDF
How to reduce cold starts for Java Serverless applications in AWS at InfoShar...
PDF
How to reduce cold starts for Java Serverless applications in AWS at JCON Wor...
PDF
High performance Serverless Java on AWS at Froscon 2024
PDF
High performance Serverless Java on AWS at We Are Developers 2024
PDF
High performance Serverless Java on AWS- Serverless Architecture Conference B...
PDF
High performance Serverless Java on AWS- JavaDays Lviv 2024
Adopting Java for the Serverless World at JUG Darmstadt 2022
Adopting Java for the Serverless World at JUG Bonn 2022
Adopting Java for the Serverless world at AWS User Group Pretoria
Adopting Java for the Serverless World at JAX 2022
Adopting Java for the Serverless world at JUG London
Adopting Java for the Serverless world at Serverless Meetup Singapore
Adopting Java for the Serverless World at VoxxedDays Luxemburg
Adopting Java for the Serverless world at IT Tage
Adopting Java for the Serverless world at Serverless Meetup Italy
Adopting Java for the Serverless world at Serverless Meetup New York and Boston
Adopting Java for the Serverless World at Voxxed Days Bruxelles 2023
Adapting Java for the Serverless World at JUG Barcelona
Adopting Java for the Serverless world at JUG Hamburg
How to reduce cold starts for Java Serverless applications in AWS at Serverle...
How to reduce cold starts for Java Serverless applications in AWS at InfoShar...
How to reduce cold starts for Java Serverless applications in AWS at JCON Wor...
High performance Serverless Java on AWS at Froscon 2024
High performance Serverless Java on AWS at We Are Developers 2024
High performance Serverless Java on AWS- Serverless Architecture Conference B...
High performance Serverless Java on AWS- JavaDays Lviv 2024
Ad

More from Vadym Kazulkin (20)

PDF
How to develop, run and optimize Spring Boot 3 application on AWS Lambda - Wa...
PDF
Event-driven architecture patterns in highly scalable image storage solution-...
PDF
High performance Serverless Java on AWS- Serverless Architecture Javaland 2025
PDF
How to develop, run and optimize Spring Boot 3 application on AWS Lambda-OBI ...
PPTX
Making sense of AWS Serverless operations- AWS User Group Nuremberg
PDF
How to develop, run and optimize Spring Boot 3 application on AWS Lambda at V...
PPTX
Making sense of AWS Serverless operations at Believe in Serverless community ...
PDF
How to develop, run and optimize Spring Boot 3 application on AWS Lambda at I...
PDF
Making sense of AWS Serverless operations - Amarathon Geek China 2024
PDF
Event-driven architecture patterns in highly scalable image storage solution-...
PDF
High performance Serverless Java on AWS- Serverless Meetup Toronto
PDF
Making sense of AWS Serverless operations- Serverless Architecture Conference...
PDF
Detect operational anomalies in Serverless Applications with Amazon DevOps Gu...
PDF
Detect operational anomalies in Serverless Applications with Amazon DevOps Gu...
PDF
High performance Serverless Java on AWS- AWS Community Day Budapest 2024
PDF
Making sense of AWS Serverless operations AWS Community Day NL 2024-
PDF
Event-driven architecture patterns in highly scalable image storage solution ...
PDF
Detect operational anomalies in Serverless Applications with Amazon DevOps Gu...
PDF
High performance Serverless Java on AWS at AWS Community Day Belfast 2024
PDF
Amazon DevOps Guru for Serverless Applications at JAWS Pankration 2024
How to develop, run and optimize Spring Boot 3 application on AWS Lambda - Wa...
Event-driven architecture patterns in highly scalable image storage solution-...
High performance Serverless Java on AWS- Serverless Architecture Javaland 2025
How to develop, run and optimize Spring Boot 3 application on AWS Lambda-OBI ...
Making sense of AWS Serverless operations- AWS User Group Nuremberg
How to develop, run and optimize Spring Boot 3 application on AWS Lambda at V...
Making sense of AWS Serverless operations at Believe in Serverless community ...
How to develop, run and optimize Spring Boot 3 application on AWS Lambda at I...
Making sense of AWS Serverless operations - Amarathon Geek China 2024
Event-driven architecture patterns in highly scalable image storage solution-...
High performance Serverless Java on AWS- Serverless Meetup Toronto
Making sense of AWS Serverless operations- Serverless Architecture Conference...
Detect operational anomalies in Serverless Applications with Amazon DevOps Gu...
Detect operational anomalies in Serverless Applications with Amazon DevOps Gu...
High performance Serverless Java on AWS- AWS Community Day Budapest 2024
Making sense of AWS Serverless operations AWS Community Day NL 2024-
Event-driven architecture patterns in highly scalable image storage solution ...
Detect operational anomalies in Serverless Applications with Amazon DevOps Gu...
High performance Serverless Java on AWS at AWS Community Day Belfast 2024
Amazon DevOps Guru for Serverless Applications at JAWS Pankration 2024

Recently uploaded (20)

PPTX
Telecom Fraud Prevention Guide | Hyperlink InfoSystem
PDF
Sensors and Actuators in IoT Systems using pdf
PDF
Top Generative AI Tools for Patent Drafting in 2025.pdf
PDF
Enable Enterprise-Ready Security on IBM i Systems.pdf
PPTX
Web Security: Login Bypass, SQLi, CSRF & XSS.pptx
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
How to Build Crypto Derivative Exchanges from Scratch.pptx
PDF
A Day in the Life of Location Data - Turning Where into How.pdf
PDF
ai-archetype-understanding-the-personality-of-agentic-ai.pdf
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
How Onsite IT Support Drives Business Efficiency, Security, and Growth.pdf
PDF
Reimagining Insurance: Connected Data for Confident Decisions.pdf
PPTX
Belt and Road Supply Chain Finance Blockchain Solution
PDF
Smarter Business Operations Powered by IoT Remote Monitoring
PDF
creating-agentic-ai-solutions-leveraging-aws.pdf
Telecom Fraud Prevention Guide | Hyperlink InfoSystem
Sensors and Actuators in IoT Systems using pdf
Top Generative AI Tools for Patent Drafting in 2025.pdf
Enable Enterprise-Ready Security on IBM i Systems.pdf
Web Security: Login Bypass, SQLi, CSRF & XSS.pptx
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
How to Build Crypto Derivative Exchanges from Scratch.pptx
A Day in the Life of Location Data - Turning Where into How.pdf
ai-archetype-understanding-the-personality-of-agentic-ai.pdf
Understanding_Digital_Forensics_Presentation.pptx
Chapter 3 Spatial Domain Image Processing.pdf
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
NewMind AI Monthly Chronicles - July 2025
How Onsite IT Support Drives Business Efficiency, Security, and Growth.pdf
Reimagining Insurance: Connected Data for Confident Decisions.pdf
Belt and Road Supply Chain Finance Blockchain Solution
Smarter Business Operations Powered by IoT Remote Monitoring
creating-agentic-ai-solutions-leveraging-aws.pdf

Adopting Java for the Serverless World at JUG Hessen 2022

  • 1. Adopting Java for the Serverless world from the perspective of the AWS developer Vadym Kazulkin, ip.labs, JUG Hessen, 28 April 2022
  • 2. Contact Vadym Kazulkin ip.labs GmbH Bonn, Germany Co-Organizer of the Java User Group Bonn [email protected] @VKazulkin https://www.linkedin.com/in/vadymkazulkin https://www.iplabs.de/
  • 8. 2020 Magic Quadrant for Cloud Infrastructure & Platform Services https://pages.awscloud.com/GLOBAL-multi-DL-gartner-mq-cips-2020-learn.html?pg=LWIAWS https://aws.amazon.com/de/resources/analyst-reports/gartner-mq-cips-2021/ Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 9. Vadym Kazulkin @VKazulkin , ip.labs GmbH “State of Serverless 2020 report” https://codingsans.com/blog/serverless-trends
  • 10. The State of Serverless 2021 https://www.datadoghq.com/state-of-serverless/ Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 11. The State of Serverless 2021 https://www.datadoghq.com/state-of-serverless/ Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 12. Life of the Java Serverless developer on AWS
  • 13. AWS Java Versions Support • Java 8 • With extended long-term support • Java 11 (since 2019) • Only Long Term Support (LTS) by AWS • Current LTS Java version is Java 17 • Amazon Corrett Support for 17 is released, but not currently available for Lambda Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: https://aws.amazon.com/de/corretto/
  • 14. Java ist very fast and mature programming language… Image: burst.shopify.com/photos/a-look-across-the-landscape-with-view-of-the-sea … but Serverless adoption of Java looks like this Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 15. 2020 AWS Lambda Benchmark Report for Developers, DevOps, and Decision Makers https://newrelic.com/resources/ebooks/serverless-benchmark-report-aws-lambda-2020 Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 16. The State of Serverless 2021 https://www.datadoghq.com/state-of-serverless/ Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 17. Developers love Java and will be happy to use it for Serverless But what are the challenges Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 18. AWS Lambda Basics Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 19. Creating AWS Lambda with Java 1/3 : Source https://blog.runscope.com/posts/how-to-write-your-first-aws-lambda-function
  • 20. Creating AWS Lambda with Java 2/3 : Source https://blog.runscope.com/posts/how-to-write-your-first-aws-lambda-function
  • 21. Creating AWS Lambda with Java 3/3 : Source https://docs.aws.amazon.com/lambda/latest/dg/java-context.html
  • 22. AWS Lambda Price Model Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 23. Cost for Lambda REQUEST DURATION Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 24. Request Tier $ 0.20 Per 1 Mio Requests Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 25. Duration Tier $ 0.00001667 (x86) $ 0.00001333 (Arm) Per GB-Second Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 26. GB-Second ONE SECOND ONE GB Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 27. Example • 1 Mio requests • Lambda x86 with 512MiB • Each lambda takes 200ms 0.5 GiB * 0.2 sec * 1 Mio = 100 000 GB-Seconds Requests: $0.20 GB-Seconds: $1.67 Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 28. Challenge Number 1 with Java is a big cold-start Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: https://www.serverless.com/blog/keep-your-lambdas-warm
  • 29. Cold Start : Sources: Ajay Nair „Become a Serverless Black Belt” https://www.youtube.com/watch?v=oQFORsso2go Tomasz Łakomy "Notes from Optimizing Lambda Performance for Your Serverless Applications“ https://tlakomy.com/optimizing-lambda-performance-for-serverless-applications
  • 30. • Start Firecracker VM • AWS Lambda starts the JVM • Java runtime loads and initializes handler class • Static initializer block of the handler class is executed • Init-phase has full CPU access up to 10 seconds for free for the managed execution environments • Lambda calls the handler method • Full CPU access only approx. at 1.8 GB “assigned” memory to the function Sources: Ajay Nair „Become a Serverless Black Belt” https://www.youtube.com/watch?v=oQFORsso2go Tomasz Łakomy "Notes from Optimizing Lambda Performance for Your Serverless Applications“ https://tlakomy.com/optimizing-lambda-performance-for-serverless-applications Michael Hart: „Shave 99.93% off your Lambda bill with this one weird trick“ https://hichaelmart.medium.com/shave-99-93-off-your-lambda-bill-with-this-one-weird-trick-33c0acebb2ea
  • 31. Function lifecycle- a full cold start Sources: Ajay Nair „Become a Serverless Black Belt” https://www.youtube.com/watch?v=oQFORsso2go Tomasz Łakomy "Notes from Optimizing Lambda Performance for Your Serverless Applications“ https://tlakomy.com/optimizing-lambda-performance-for-serverless-applications
  • 32. AWS Lambda cold start duration per programming language Source: Mikhail Shilkov: „AWS Lambda: Cold Start Duration per Language. 2020 edition” https://mikhail.io/serverless/coldstarts/aws/languages/
  • 33. Cold start duration with Java • Below 1 second is best-case cold start duration for very simple Lambda like HelloWorld with no dependencies • It goes up significantly with more complex scenarios • Instantiation outside of the handler method (static initializer block) to communicate with other (AWS) services (e.g. DynamoDB, SNS, SQS, 3rd party) • Artifact size Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8 Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/
  • 34. AWS Lambda cold starts by memory size, runtime and artifact size Source: Mike Roberts "Analyzing Cold Start latency of AWS Lambda" https://blog.symphonia.io/posts/2020-06-30_analyzing_cold_start_latency_of_aws_lambda Artifact Size: • Small zip (1KB) • Large zip (48MB) • Large uberjar (53MB)
  • 35. Cold start duration with Java • Below 1 second is best-case cold start duration for very simple Lambda like HelloWorld with no dependencies • It goes up significantly with more complex scenarios • Instantiation outside of the handler method (static instantiation) to communicate with other (AWS) services (i.e. DynamoDB, SNS, SQS, 3rd party) • Artifact size • To minimize the cold start time apply best practices from this talk • Worst-case cold starts can be higher than 10 and even 20 seconds Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8 Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/
  • 36. Best Practices and Recommendations Using Tiered Compilation • Achieve up to 60% faster startup times can use level 1 compilation with little risk of reducing warm start performance Mark Sailes: "Optimizing AWS Lambda function performance for Java” https://aws.amazon.com/de/blogs/compute/optimizing-aws-lambda-function-performance-for-java/
  • 37. • Switch to the AWS SDK 2.0 for Java • Lower footprint and more modular • Allows to configure HTTP Client of your choice (i.e. Java own Basic HTTP Client or newly introduced AWS Common Runtime async HTTP Client) Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8 Zoe Wang: „Introducing AWS Common Runtime HTTP Client in the AWS SDK for Java 2.x” https://aws.amazon.com/de/blogs/developer/introducing-aws-common-runtime-http-client-in-the-aws-sdk-for-java-2-x/ S3AsyncClient.builder() .httpClientBuilder(AwsCrtAsyncHttpClient.builder() .maxConcurrency(50)) .build(); Best Practices and Recommendations
  • 38. Provide all known values (for building clients i.e. DynamoDB client) to avoid auto-discovery • credential provider, region, endpoint AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withRegion(Regions.US_WEST_2) .withCredentials(new ProfileCredentialsProvider("myProfile")) .build(); Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8 Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/ Best Practices and Recommendations
  • 39. • Initialize dependencies during initialization phase • Use static initialization in the handler class, instead of in the handler method (e.g. handleRequest) to take the advantage of the access to the full CPU core for max 10 seconds • In case of DynamoDB client put the following code outside of the handler method: AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()...build(); DynamoDB dynamoDB = new DynamoDB(client); Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8 Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/ Best Practices and Recommendations
  • 40. • Less (dependencies, classes) is more • Include only required dependencies (e.g. not the whole AWS SDK 2.0 for Java, but the dependencies to the clients to be used in Lambda) • Exclude dependencies, which you don‘t need at runtime e.g. test frameworks like Junit Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8 Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/ https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2 <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.4.2</version> <scope>test</scope> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb</artifactId> <version>2.10.86</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.10.86</version> <type>pom</type> <scope>import</scope> </dependency> Best Practices and Recommendations
  • 41. Avoid: • reflection • runtime byte code generation • runtime generated proxies • dynamic class loading Use DI Frameworks like Micronaut, Quarkus or Dagger which aren‘t reflection-based Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8 Sean O‘Toole „AWS Lambda Java Tutorial: Best Practices to Lower Cold Starts” https://www.capitalone.com/tech/cloud/aws-lambda-java-tutorial-reduce-cold-starts/ Best Practices and Recommendations
  • 42. Strive for cost optimization Vadym Kazulkin @VKazulkin , ip.labs GmbH Best Practices and Recommendations
  • 43. Cost for Lambda REQUEST DURATION Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 44. Cost scales linearly with memory Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 45. More memory = more expensive? Kazulkin @VKazulkin , ip.labs GmbH
  • 46. Tooling for AWS Lambda in Java Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 47. Lambda Power Tuning 1/2 • Executes different settings in parallel • Outputs the optimal setting Image: https://github.com/alexcasalboni/aws-lambda-power-tuning Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 48. Lambda Power Tuning 2/2 • Executes different settings in parallel • Outputs the optimal setting Image: https://github.com/alexcasalboni/aws-lambda-power-tuning Alex Casalboni: “Deep dive: finding the optimal resources allocation for your Lambda functions“ https://dev.to/aws/deep-dive-finding-the-optimal-resources-allocation-for-your-lambda-functions-35a6 Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 49. Optimizing AWS Lambda cost and performance using AWS Compute Optimizer Source: Chad Schmutzer „Optimizing AWS Lambda cost and performance using AWS Compute Optimizer” https://aws.amazon.com/de/blogs/compute/optimizing-aws-lambda-cost-and-performance-using-aws-compute-optimizer/
  • 50. AWS Lambda Powertools Java 1/3 https://aws.amazon.com/de/blogs/opensource/simplifying-serverless-best-practices-with-aws-lambda-powertools-java/
  • 51. AWS Lambda Powertools Java 2/3 https://aws.amazon.com/de/blogs/opensource/simplifying-serverless-best-practices-with-aws-lambda-powertools-java/ When using different Java annotations provided by the library, configure the aspectj-maven-plugin to compile-time weave the aws-lambda-powertools-java aspects into your project.
  • 52. AWS Lambda Powertools Java 3/3 https://aws.amazon.com/de/blogs/opensource/simplifying-serverless-best-practices-with-aws-lambda-powertools-java/
  • 53. AWS Lambda Java Libs https://github.com/aws/aws-lambda-java-libs
  • 54. Cost optimization • Java is well optimized for long running server applications • High startup times • High memory utilization Vadym Kazulkin @VKazulkin , ip.labs GmbH And both memory and execution time are cost dimensions, when using Serverless in the cloud
  • 55. GraalVM enters the scene Source: https://www.graalvm.org/
  • 56. GraalVM Goals: Low footprint ahead-of-time mode for JVM-based languages High performance for all languages Convenient language interoperability and polyglot tooling Source: „Everything you need to know about GraalVM by Oleg Šelajev & Thomas Wuerthinger” https://www.youtube.com/watch?v=ANN9rxYo5Hg
  • 57. GraalVM Architecture Sources: Practical Partial Evaluation for High-Performance Dynamic Language Runtimes http://chrisseaton.com/rubytruffle/pldi17-truffle/pldi17-truffle.pdf „The LLVM Compiler Infrastructure“ https://llvm.org/
  • 58. SubstrateVM Source: Oleg Šelajev, Thomas Wuerthinger, Oracle: “Deep dive into using GraalVM for Java and JavaScript” https://www.youtube.com/watch?v=a-XEZobXspo
  • 59. GraalVM on SubstrateVM A game changer for Java & Serverless? Java Function compiled into a native executable using GraalVM on SubstrateVM reduces • “cold start” times • memory footprint by order of magnitude compared to running on JVM. And both memory and execution time are cost dimensions, when using Serverless in the cloud
  • 60. GraalVM on SubstrateVM A game changer for Java & Serverless? Current challenges with native executable using GraalVM : • Most Cloud Providers (AWS) doesn’t provide GraalVM as Java Runtime out of the box, only Open JDK (i.e. AWS provides Corretto) • Some Cloud Providers (e.g. AWS) provide Custom Runtime Option
  • 61. Lambda Layers & Lambda Runtime API Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 63. GraalVM Complitation Modes Source: „Everything you need to know about GraalVM by Oleg Šelajev & Thomas Wuerthinger” https://www.youtube.com/watch?v=ANN9rxYo5Hg
  • 64. AOT vs JIT Source: „Everything you need to know about GraalVM by Oleg Šelajev & Thomas Wuerthinger” https://www.youtube.com/watch?v=ANN9rxYo5Hg
  • 65. GraalVM Native Cold Start 2021 Source: Aleksandr Filichkin: "AWS Lambda battle 2021: performance comparison for all languages (cold and warm start)“ https://filia-aleks.medium.com/aws-lambda-battle-2021-performance-comparison-for-all-languages-c1b441005fd1
  • 66. Support of GraalVM native images in Frameworks Spring Framework: GraalVM native image support in Beta without requiring additional configuration Spring Boot: Ongoing work on experimental Spring Graal Native project. Quarkus: a Kubernetes Native Java framework developed by Red Hat tailored for GraalVM and HotSpot, crafted from best-of-breed Java libraries and standards. Micronaut: a modern, JVM-based, full-stack framework for building modular, easily testable microservice and serverless applications.
  • 67. Common principles for all Frameworks • Rely on as little reflection as possible • Avoid runtime byte code generation, runtime generated proxies and dynamic class loading as much as possible • Process annotations at compile time • Compatible with Spring‘s annotations • The common goals: • increase developer productivity • speed up start up times and decrease memory usage for Microservice and Serverless Java applications • with and without usage of GraalVM and native image
  • 68. Steps to deploy to AWS • Installation prerequisites • Framework of your choice (Micronaut, Quarkus, Spring) • GraalVM and Native Image • Apache Maven or Gradle • AWS CLI and AWS SAM CLI (or SAM local for local testing) • Build Linux executable of your application with GraalVM native-image • Use Maven or Gradle plugin (if available) • Deploy Linux executable as AWS Lambda Custom Runtime • Function.zip with bootstrap Linux executable Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 69. AWS Lambda Deployment of Custom Runtime with SAM Source: https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store
  • 72. Micronaut Additional Features • Custom Validators • AWS API Gateway integration Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store
  • 73. Micronaut® AOT: build-time optimizations for Micronaut applications Micronaut AOT is an extension to the Micronaut Framework which is the foundation to many optimizations that can be implemented at build time but weren’t possible solely with annotation processing. By effectively analyzing the deployment environment, AOT is capable of reducing startup times or distribution size for both native and JVM deliverables. Source: “Introducing Micronaut® AOT: build-time optimizations for your Micronaut applications” https://medium.com/graalvm/introducing-micronaut-aot-build-time-optimizations-for-your-micronaut-applications-68b8f1302c5
  • 74. Build GraalVM Native Image with Micronaut Framework Maven plugin available since Micronaut 2.2 for building GraalVM Native Image ./mvnw package -Dpackaging=native-image Docker ./mvnw mn:dockerfile -Dpackaging=docker Docker Native Image ./mvnw mn:dockerfile -Dpackaging=docker-native Source: “What's new for Maven users in Micronaut 2.2” : https://micronaut.io/blog/2020-11-23-whats-new-maven.html
  • 76. Build GraalVM Native Image with Quarkus mvn –Pnative package
  • 77. Quarkus Additional Features • Website for creating the App • AWS API Gateway integration • Eclipse MicroProfile compatible • Funqy for multi cloud solutions Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: Stefano Buliani : "Best practices for AWS Lambda and Java„ https://www.youtube.com/watch?v=ddg1u5HLwg8
  • 79. Quarkus-Fanqy AWS Serverless Support • AWS Lambda • AWS API Gateway Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: https://quarkus.io/guides/funqy-amazon-lambda-http
  • 80. Spring (Boot) Framework Source: https://spring.io/
  • 81. Spring GraalVM Native Project Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: https://github.com/spring-projects-experimental/spring-native
  • 82. Build GraalVM Native Image with Spring Framework mvn –Pnative package
  • 83. Framework Comparison 1/2 • Project Initializer • Programming Model • Database Support • Test Support • Standards Support (i.e. MicroProfile) Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: „Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! by Michel Schudel“ https://www.youtube.com/watch?v=hnEXOqcNXPs „Micronaut 2.0 vs Quarkus 1.3.1 vs Spring Boot 2.3 Performance on JDK 14“ https://www.youtube.com/watch?v=rJFgdFIs_k8 „Java EE, Jakarta EE, MicroProfile, or Maybe All of Them” https://www.eclipse.org/community/eclipse_newsletter/2019/february/Jakarta_Micro_All.php
  • 84. Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: „Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! by Michel Schudel“ https://www.youtube.com/watch?v=hnEXOqcNXPs „Micronaut 2.0 vs Quarkus 1.3.1 vs Spring Boot 2.3 Performance on JDK 14“ https://www.youtube.com/watch?v=rJFgdFIs_k8 • Native Image with GraalVM • Build time • Framework compile-time activities • GraalV Native Image compilation time • Native Image Size • (Cold) Startup Time • Request/Invocation duration • Memory Consumption • Plain • Application Size • (Cold) Start Time • Request/Invocation duration • Memory Consumption Framework Comparison 2/2
  • 85. Lambda demo with common Java application frameworks Vadym Kazulkin @VKazulkin , ip.labs GmbH https://github.com/aws-samples/serverless-java-frameworks-samples
  • 86. Lambda Container Image Support Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: „https://aws.amazon.com/de/blogs/aws/new-for-aws-lambda-container-image-support/
  • 87. Lambda Container Image Support Use Cases: • What about the support of the current Java version? • Only Long Term Support (LTS) by AWS • Java 8, Java 11, Java 17 (not for Lambda) • Use Container (Docker) Image with i.e. Java 18 • GraalVM without Native Image may be faster than OpenJDK for your application • Use Container (Docker) Image with GraalVM Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: https://aws.amazon.com/de/corretto/ https://renaissance.dev/
  • 88. Conclusion 1/2 • GraalVM and Frameworks are really powerful with a lot of potential • Micronaut and Quarkus will improve the cold starts of Java applications significantly even without GraalVM and native image • They use as little as possible reflection and other runtime optimizations • Cold start duration will still be in the range of maximal single digit (e.g. 1.5) seconds depending on your application and framework Vadym Kazulkin @VKazulkin , ip.labs GmbH Source: „https://stackoverflow.com/questions/63328298/how-do-you-debug-a-no-instances-of-are-allowed-in-the-image-heap-when-buil
  • 89. Conclusion 2/2 • But the combination of discussed frameworks with GraalVM and Native Image currently not without challenges • AWS Lambda Custom Runtime requires Linux executable only • Managing Custom Runtime requires some additional effort • You pay for the init-phase of the function packaged as AWS Lambda Custom Runtime • Init-phase is free for the managed runtimes like Java 8 and Java 11 • Reduce cold starts to several hundred milliseconds and very low memory consumption Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 90. Personal Recommendations (highly opinionated) • By default use plain Java Long Term Support Version with Amazon Corretto and (in case you need it additionally) your favourite Framework (Micronaut, Quarkus) • If your function needs constantly low response times for the known period of time ? • Use Provisioned Concurrency additionally • If your function needs constantly low response time and low cost is a requirement? • Use GraalVM Native Image with your favourite Framework (Micronaut, Quarkus, Spring Boot GraalVM Native) and AWS Lambda Custom Runtime • Consider refactoring costs in your TCO calculation • If you don‘t want to miss 3 years of innovation and use the newest Java Version? • Use Lambda Container Image Support Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 91. Try it yourselves • Micronaut • https://github.com/micronaut-guides/micronaut-function-aws-lambda • Quarkus • https://github.com/JosemyDuarte/quarkus-terraform-lambda-demo/tree/dynamo- terraform • Spring Native • https://github.com/spring-projects-experimental/spring-native/tree/main/samples/cloud- function-aws • Misc examples with all frameworks • https://github.com/awslabs/aws-serverless-java-container/tree/master/samples Vadym Kazulkin @VKazulkin , ip.labs GmbH
  • 93. www.iplabs.de Accelerate Your Photo Business Get in Touch