Amazon heeft een nieuwe functie geïntroduceerd voor zijn AWS Lambda-platform waarmee het een einde wil maken aan lange coldstarts van Java-lambda’s. Met SnapStart versnelt de cloudgigant de Init-fase van Java-lambda’s sterk.
Het is een bekend probleem voor teams die serverless gebruiken: Java-lambda's die traag starten. Er wordt in het Java-ecosysteem hard gewerkt om het probleem op te lossen, door over te stappen op native code met GraalVM. AWS komt nu met zijn eigen oplossing, genaamd SnapStart.
Een lambda heeft drie fases: init
, invoke
en shutdown
. Bij een Java-lambda is vooral de init traag, vanwege het starten van de JVM, laden van classes en compileren van Java vanwege JIT. De flexibiliteit van Java om dynamisch classes te laden is een groot minpunt als je snel wilt starten. Dit sluit het gebruik van een framework als Spring Boot of Quarkus vaak al uit vanwege het enorme aantal classes in die frameworks.
Amazon pakt het probleem aan met SnapStart. Dat werkt als volgt: na een lambda-deployment initialiseert AWS eenmalig de lambda tot aan de init
-fase. AWS maakt dan een snapshot van de staat van je lambda met Firecracker. De snapshot bevat de schijf, geheugen en caches. Als de lambdafunctie daarna opnieuw wordt gestart, slaat die de init
over en gaat die direct vanaf de snapshot door. In tests van Amazon wordt een coldstart daarmee verminderd van 6,3 seconden naar 142 ms.
SnapStart staat niet meteen voor alle Java-lambdas aan, want er zijn wel een aantal dingen om rekening mee te houden. Zo moet je oppassen met uniqueness, zoals willekeurige getallen, tijdens de init, die zijn dan niet meer uniek. Ook moeten netwerkconnecties tijdens de init mogelijk opnieuw opgezet worden en is het nodig om van bestanden die tijdens de init gedownload zijn te checken of ze nog up-to-date zijn. Ook werkt SnapStart alleen als je een lambda start met een fully qualified ARN, dat is de ARN met het versienummer van de lambda. Dat is in veel IaC-tooling zoals de CDK of Cloudformation vaak niet het geval.
AWS SnapStart werkt voor lambdas met Java 11 (Coretto JDK) op de x86_64-architectuur in een beperkt aantal regio's (in Europa voor Frankfurt, Ierland en Stockholm). ARM-lambdas worden helaas nog niet ondersteund, evenals Java 17-lambdas. Je vindt de volledige aankondiging van deze nieuwe functie op het AWS-blog.