Scala: Microservices mit dem Actor-Modell serialisieren
Sollen Microservices mit funktionaler Programmierung oder CQRS umgesetzt werden, bieten sich alternativ zu Spring Boot Scala und die Akka-HTTP-Library an.
- Christian Mang
Für inzwischen weit verbreitete Microservices-Architekturen nutzen Entwicklerinnen und Entwickler häufig Java und Spring Boot als bewährte, aktiv unterstützte und kontinuierlich weiterentwickelte Programmierbasis. Wer allerdings tiefer in die funktionale Programmierung einsteigen will, stößt mit Spring Boot und Java schnell an Grenzen. Auch Patterns wie CQRS (Command Query Responsibility Segregation) erfordern andere Tools. Als Alternativen zu Java und Spring Boot bieten sich in solchen Fällen die Programmiersprache Scala und die Library Akka HTTP an.
Nach einer kurzen Einführung von einer höheren Abstraktionsebene zeigt der Autor anhand beispielhafter Modelle für nebenläufige Berechnungen sowie eines Überblicks zur Funktionsweise von Actors und sogenannter finite-state machines (Endlicher Automat bzw. Zustandsmaschine), wie sich die Library Akka HTTP in Kombination mit Scala für Microservices einsetzen lässt – bis hin zum Cluster-Betrieb und Zusammenspiel mit Kubernetes. Ein Demoprojekt, das die im Folgenden dargestellten Beispiele lauffähig enthält, liegt auf GitHub parat.
Request und Response
Abstrakt betrachtet ist ein REST Endpoint eine Funktion, die einen HTTP-Request entgegennimmt und eine HTTP-Response zurückgibt. Welche Funktion innerhalb einer Anwendung den HTTP-Request erhält, ist durch Annotationen, durch ein Route-File oder eine DSL (Domain-specific Language) festgelegt.
f(HttpRequest) => HttpResponse
Spring Boot weist dabei jedem HTTP-Request einen Thread aus dem eigenen Thread-Pool zu. Die Threads isolieren die Aufrufe voneinander. Jeder Aufruf läuft, aus seiner Sicht gesehen, allein und sequenziell ab. Nebenläufigkeit lässt sich bei mehreren aktuell bearbeiteten HTTP-Requests durch die parallel ablaufenden Threads erreichen. Je mehr HTTP-Requests ein Microservice gleichzeitig bearbeiten muss, desto mehr kann er parallel verarbeiten. Schwierig wird es erst dann, wenn eine Art von Synchronisierung zwischen den Threads erforderlich ist. Entwicklerinnen und Entwickler, die beim Implementieren Performance-Bottlenecks vermeiden wollen, stehen – abhängig von den spezifischen Anforderungen – vor ernsten Herausforderungen.
Akka HTTP setzt auf Actors, um die HTTP-Requests abzuarbeiten. Actors verkörpern im Vergleich zum Threading-Modell von Spring ein vollkommen anderes Modell für nebenläufige Berechnungen, das Carl Hewitt, Peter Bishop und Richard Steiger erstmals 1973 beschrieben. Heute existieren Implementierungen unter anderen in Erlang und Scala (mit einer Java API).