Technologie

Projektionen in Eventsourcing

13. September 2021

Event Sourcing wird immer beliebter. Eventsourcing wird meist kombiniert mit Domain-driven Design (DDD) und Command-Query-Responsibility-Segregation (CQRS).

Die heutigen Datenmengen wachsen stetig an und Entscheidungen müssen immer schneller getroffen werden. In vielen digitalen Transformationsstrategien von großen Unternehmen steht deshalb die Echtzeitverarbeitung an hoch priorisierter Stelle. Hier kommen Projektionen ins Spiel. Erfahren Sie, was Projektionen genau sind, welche Vorteile sie bieten und wie sie sich implementieren lassen.

‍Was ist eine Projektion?

Vereinfacht gesagt: Mit Projektionen lassen sich Daten effektiv in Kontexte spalten. Dazu werden Daten aus einem oder mehreren Event Streams genommen und mittels einer Projektion verarbeitet. Die Events werden durch die Projektionen (Event Processors) geleitet, die dann Teile des Events in einem “Read Model” (in den meisten Fällen handelt es sich hierbei um eine Datenbank) ablegen und dafür die zuvor aggregierten Zustände nutzt. Projektionen helfen dabei, die Vielzahl an Informationen, die beim Event Sourcing entstehen, zu gruppieren und zum Beispiel für visuelle Reports verfügbar zu machen. Dazu bilden sie einen Teil der persistenten Daten ab, die im aggregierten Zustand eines Systems und basierend auf den im Event Store gespeicherten Event Streams, zusammenkommen. Je nachdem, zu welchem Zweck eine Projektion eingesetzt wird, kann sie unterschiedlich modelliert werden und so verschiedene Informationen und Zustände abbilden. So lassen sich beispielsweise auch alle historischen und bisher gesammelten Informationen abrufen und in die Projektion einbinden.

Darstellung einer Projektion im Event Stream.‍

Woher stammt der Begriff Projektion?

Der Begriff stammt aus dem Even Sourcing und CQRS (Command and Query Responsibility Segregation) Umfeld. Er wird nicht nur eingesetzt, wenn von einem Report die Rede ist. Er bezeichnet auch den Transformationsprozess der in den Streams gespeicherten Informationen in die gewünschten Datenmodelle – auf diese Weise können beliebige Events in ein neues Datenmodell transformiert werden. Im Streaming Processing Umfeld bezeichnet man Projektionen auch einfach als stream processor.

Wo werden Projektionen eingesetzt?

Die Einsatzmöglichkeiten von Projektionen sind vielfältig, ob im Reporting, in der Prozessoptimierung, in der Darstellung von User Interfaces (UI) oder der Aufbereitung von im Backend benötigten Daten. Ein beliebtes Beispiel ist das Reporting von Lagerbeständen: Über die kompakte bildliche Darstellung können Lagermenge, Lagerzeit und Auslieferungszustand auf einen Blick erfasst werden. Ein anderes Beispiel ist die Projektion von digitalem Kaufverhalten: Alle bisher über einen Account getätigten Online-Käufe können chronologisch über den Warenkorb aufgelistet werden. Neben den schlussendlich gekauften Waren werden aber auch Produkte angezeigt, die zwar zum Warenkorb hinzugefügt wurden, bei denen es jedoch nicht zum Kauf gekommen ist. Damit liefern sie den Anbietern von Online-Shops einen tieferen Einblick in das Kaufverhalten.

Mit Event Streaming lässt sich digitales Kaufverhalten abbilden.

‍Die Vorteile von Projektionen

Inherent ist klar, dass dank Projektionen nicht für jede Query der gesammte Event Store/ Stream mit einem Replay der Events ausgewertet werden muss.  Bei grossen Event Stores wäre dies eine langwierige Aufgabe. Mittels Projektionen lassen sich die Daten somit immer aktuell abbilden, da sie aufgrund stetig durchgeführter Updates immer den Status quo eines Systems sowie die gewünschten Informationen zeigen. Die Updates verlaufen dabei synchron oder asynchron. Synchron heisst, dass mit einem neuen Event auch die Projektion angepasst wird, während asynchron bedeutet, dass das Event zunächst im Event Store erfasst und erst dann in die Projektion aufgenommen wird, da nicht jeder Event im Event Store abgelegt sein muss.

Einfache Datenabfrage

Meist sind die Event Stores nicht darauf ausgelegt, einfache Abfragen zu erlauben, und wenn doch, gestalten sich diese oft sehr aufwändig. Projektionen lösen dieses Problem, indem sie die Daten strukturiert für den Use Case freigeben und Datenabfragen aus den Event Stores heraus überflüssig machen.

Trennung von Reads und Writes

Ein weiterer Vorteil von Projektionen? Die Trennung von Write und Read Models (CQRS). Projektionen unterstützen die Trennung der beiden Objektmodelle, da die Sammlung von Events und Event Streams sowie die dazugehörige Speicherung in den Stores vollständig losgelöst von der anschliessenden Projektion verläuft. Somit können Write und Read Models mit den passenden Technologien verarbeitet werden. Für die Read Models eignet sich beispielsweise eine No-SQL Datenbank, während für den Event Store meist eine andere Lösung besser passt.

Trennung von Write und Read Models und Verortung von Projektionen.

‍Projektionen implementieren und Potenzial ausschöpfen

Die Implementierung von Projektionen ist im Einzelfall mitunter abhängig von bestimmten Voraussetzungen – insbesondere, welche Ziele damit verfolgt werden. Deshalb sollte immer auch die bestehende Infrastruktur beziehungsweise der bestehende Software-Stack beachtet werden. Das Wichtigste dabei ist zu verstehen, wie die Daten später aus den Read Models, in denen sie gespeichert werden, gelesen werden.

Welche Lösung für welches Problem?

  • Ist die Anfrage an das Read Model stets statisch, wird also zum Beispiel nur die “Anzahl Artikel im Warenkorb” abgefragt, ist eine No-SQL Lösung passend. Im Webshop können so User Experiences (UI) gut abgebildet werden.
  • Ist zunächst noch unklar, welche Tabellen/Collections und welche Felder kombiniert werden müssen, ist ein RDBMS eine geeignetere Wahl.
  • Bei einigen Events ist ein In-Memory Approach eine sinnvolle Entscheidung.
  • Eine Search Engine bietet sich an, wenn der Use Case beispielsweise eine Suche über alle in der Vergangenheit getätigten Käufe ist.

Fazit

Zusammengefasst lässt sich sagen, dass Projektionen dabei helfen, für jeden Use Case die geeigneten Read Models und Datenbanken einzusetzen. Dadurch lassen sich Applikationen skalieren und die User Experience auf das bestmögliche Niveau heben.

📝 Gefällt dir, was du liest?

Dann lass uns in Kontakt treten! Unser Engineering-Team wird sich so schnell wie möglich bei dir melden.