Problem
Es ist bekannt, dass beim Aufruf einer AWS Lambda eine Runtime instanziiert wird, welche nach Bearbeitung der Anfrage nicht sofort wieder abgeräumt wird. AWS hält diese Runtime eine gewisse Zeit warm, um sie für spätere Aufrufe wiederverwenden zu können. AWS empfiehlt hier, die Execution Environment der Runtime zu nutzen, um die Lambda-Funktion performanter zu machen. Doch wie funktioniert das?
Lösung
Einfach gesagt, gibt es in einer Node.js Lambda nur die Handler-Funktion selbst und einen globalen JavaScript-Kontext. Bei jedem Aufruf der Lambda wird die Handler-Funktion ausgeführt – ein Caching innerhalb des Funktionskontext ist damit nicht möglich.
Allerdings hat diese Funktion Zugriff auf den globalen Kontext. Darin lassen sich beliebige Variablen oder Objekte speichern. Ein Folgeaufruf hat Zugriff auf diese Daten, solange diese Runtime existiert. Kombiniert man dieses Verhalten mit einer Dependency-Injection-Lösung wie tsyringe, bekommt man Instanz-Caching für Datenbank/HTTP Clients quasi geschenkt. Zudem ist es sehr simpel, statische Konfigurationen im Speicher zu cachen.
Beispiel
import { singleton } from "tsyringe";
@singleton()
class HttpClient {}
import { container, instanceCachingFactory } from "tsyringe";
export interface CoffeeCache {
configs?: CoffeeConfig[];
}
container.register("CoffeeCache", {
useFactory: instanceCachingFactory<CoffeeCache>(() => ({
/* "configs" key must be filled later */
})),
});
import { inject } from "tsyringe";
class CoffeeHandler {
constructor(@inject("CoffeeCache") cache: CoffeeCache) {}
}
Weiterführende Aspekte
- Doku zu AWS Lambda Execution Context: https://docs.aws.amazon.com/lambda/latest/dg/runtimes-context.html
- AWS Lambda Best Practices:https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html
- Source zur empfohlenen DI Lösung tsyringe: https://github.com/microsoft/tsyringe
---
Autor: Robert Gruner / Software Engineer / Standort Leipzig
Toilet Paper #147 als Download: In-memory Caching für AWS Lambda leicht gemacht (PDF)
Lust, das nächste ToiletPaper zu schreiben? Jetzt bei jambit bewerben!