Skip to content

Eventing mit Kafka (Sebastian Gauder)

MaxSimon95 edited this page Feb 17, 2019 · 8 revisions

Probleme bei REST-only Architekturen:

Wiederstandsfähigkeit gegenüber einzelnen Service-Ausfällen ist gering (Lack of Resilience) und es existiert ein Performanzverlust durch Antwortzeiten.

Grundlegendes

  • Ziel des Eventings: Es Services ermöglichen sich asynchron und performant mit Daten zu versorgen, bevor sie in einem Request benötigt werden.
  • Ein Event betrifft genau:
    • 1 domain entity
    • 1 state change
  • Ein Event enthält:
    • Event-ID,
    • Key (Welche Entität ist betroffen?),
    • Version,
    • Time (when did it occur?),
    • Type (Kind of action that happened),
    • Payload (Details): Hier gesamte Entities versenden.

Regeln

  • Events müssen selfcontained sein (nicht mit einem nachgezogenen Rest-Aufruf) Achtung: Dies wurde in anderen Vorträgen angezweifelt.
  • Transaktionale Vollständigkeit: Man darf kein Folge-Event benötigen, um wieder in einen konsistenten Systemzustand zu gelangen
  • "Only true facts must be published / committed" (z.b. ERST in DB speichern, dann Event über Datenpersistierung abschicken. Andersherum wäre ein Verstoß gegen diese Regel.)

Gründe auf Events zu verzichten:

  • Write operations: Events können nur GET-Operations ersetzen
  • Clientkommunikation benötigt HTTP/REST
  • Zeitkritischer Datenfluss: Hier kann eventual consistency problematisch sein, d.h. REST ggf. sinnvoller
  • Daumenregel: "Bei schnellen UI Interaktionen sollte man sich nicht auf Events verlassen."

Implementierung: Kafka

4 Typen von Kafka-APIs liegen vor:

  • producer
    • Nur EIN context produziert ein topic.
    • Alle producer müssen events reproduzieren könnten, z.b. wenn kafka abgestürzt ist und wieder gestartet wurde.
    • Eigentliche Herausforderung: So implementieren, dass wirklich keinerlei Nachrichten verloren gehen können
  • consumer
    • Nachrichten idem-potent verarbeiten (wenn also ein Event 2 mal ankommt, muss nach dem 2. event die Applikation im gleichen Zustand sein wie nach dem 1. )
    • blue/green deployments: Consumer wird nur nach einem succesfull processing des events verantwortlich dieses zu committen
    • Error Repository anstatt Error Log, so dass Fehlermeldungen gut wiederbeschafft und aufbereitet werden können.
  • stream
    • In unserem Kontext eher irrelevant
  • connect
    • Ähnelt der Interaktion mit Datenbanken
    • Ist sinnvoll für DB Replikation, wäre für REWE sogar besser geeigenet

Weitere Hinweise

  • Logging: Nur die most recent version für das jeweilige Event
  • In den REST-APIs: REST-APIs müssen trotz Eventing immer vollständig sein, es gibt immer GET-Schnittstellen um Daten abzuholen, auch wenn man an manchen Stellen bevorzugt auf Events zurückgreift. REST muss also als Fallback vorhanden sein.
  • Consumer driven: Consumer entscheidet dann selbst ob er Informationen als Event oder REST abholen möchte.
Clone this wiki locally