Softwarearchitektur verstehen und entscheiden

Aaron KreisÜber mich
Nachrichten und Ereignisse

Publish Subscribe

Eine Nachricht an alle Abonnenten

Die Idee und ihr Nutzen

Der Vertragsdienst einer Versicherung, das Programm für die Verwaltung von Verträgen, erfasst die Kündigung eines Kunden. Davon müssen drei andere Programme erfahren: Das Inkasso zieht die Beiträge ein. Das Kundenportal zeigt dem Kunden seinen Vertragsstand an. Die Statistik zählt Kündigungen. Der Vertragsdienst schreibt die Nachricht „Vertrag gekündigt“ nur einmal in ein Thema. Ein Thema ist ein benannter Kanal für eine Art von Nachrichten auf einer Nachrichtenplattform, einem eigenen Programm für den Nachrichtenaustausch. In das Thema vertrag schreibt der Vertragsdienst zum Beispiel alle Nachrichten über Verträge. Jedes Programm, das sich für dieses Thema angemeldet hat, erhält eine eigene Kopie. Der Vertragsdienst muss nicht wissen, welche Programme das sind. Dieses Vorgehen heißt Publish Subscribe, auf Deutsch Veröffentlichen und Abonnieren. Der Vertragsdienst veröffentlicht die Nachricht, und Inkasso, Kundenportal und Statistik haben das Thema abonniert, also sich dafür angemeldet.

Bausteine: Vertragsdienst: veröffentlicht „Vertrag gekündigt“ einmal; Thema „vertrag“: gibt jedem Abonnement eine eigene Kopie; Inkasso: hat das Thema abonniert; Kundenportal: hat das Thema abonniert; Statistik: hat das Thema abonniert. Verbindungen: Vertragsdienst → Thema „vertrag“; Thema „vertrag“ → Inkasso; Thema „vertrag“ → Kundenportal; Thema „vertrag“ → Statistik. Der Vertragsdienst veröffentlicht die Nachricht einmal; jedes Programm mit einem Abonnement für das Thema „vertrag“ erhält eine eigene Kopie.

Wie funktioniert es?

Inkasso, Kundenportal und Statistik haben je ein Abonnement für das Thema vertrag. Ein Abonnement ist eine Anmeldung bei der Nachrichtenplattform für die Nachrichten eines Themas. Der Vertragsdienst veröffentlicht die Nachricht „Vertrag 88123 gekündigt zum 31.12.“ genau einmal im Thema vertrag. Das Inkasso und die Statistik erhalten je eine eigene Kopie. Das Inkasso legt fest, dass der letzte Beitrag für Dezember eingezogen wird. Die Statistik zählt die Kündigung im laufenden Monat. Beide Zustellungen laufen gleichzeitig und unabhängig voneinander. Das Kundenportal ist zu diesem Zeitpunkt wegen Wartungsarbeiten eine Stunde lang nicht erreichbar. Das Kundenportal hat ein dauerhaftes Abonnement, also ein Abonnement, das auch dann bestehen bleibt, wenn das Kundenportal nicht mit der Nachrichtenplattform verbunden ist. Deshalb hebt die Nachrichtenplattform die Kopie für das Kundenportal auf. Nach den Wartungsarbeiten stellt die Nachrichtenplattform die Kopie zu, sofern die eingestellte Aufbewahrungszeit bis dahin nicht abgelaufen ist. Das Kundenportal zeigt den Vertrag danach als „gekündigt zum 31. Dezember“ an. Später kommt der Dienst Kundenumfragen hinzu, der Kunden nach ihrer Kündigung befragt. Der Dienst Kundenumfragen richtet ebenfalls ein Abonnement für das Thema vertrag ein. Der Vertragsdienst veröffentlicht die nächste Kündigung wie bisher, ohne geändert zu werden. Der Dienst Kundenumfragen erhält davon eine eigene Kopie.

Die Nachrichtenplattform verwaltet die Themen, im Englischen Topics genannt. Der Vertragsdienst ist der Sender, englisch Publisher. Den Aufbau der Nachricht legt das Team des Vertragsdienstes fest. Inkasso, Kundenportal und Statistik sind die Empfänger, englisch Subscriber: Jeder Empfänger richtet sein Abonnement bei der Nachrichtenplattform selbst ein und liest die Nachrichten seines Abonnements in seinem eigenen Tempo. Weil jedes Abonnement eine eigene Kopie erhält, bremst ein langsamer Empfänger die anderen Empfänger nicht. Arbeitet die Statistik ihre Nachrichten zum Beispiel mit einer Stunde Verspätung ab, erhalten Inkasso und Kundenportal die Kündigung trotzdem sofort. Läuft ein Empfänger wie das Inkasso in mehreren Instanzen, also als mehrere Exemplare desselben Programms nebeneinander, können sich diese Instanzen die Nachrichten ihres gemeinsamen Abonnements teilen. Das geht, weil alle Instanzen dieselbe Arbeit erledigen und es gleichgültig ist, welche Instanz eine Nachricht verarbeitet. Die Kündigung von Vertrag 88123 verarbeitet dann nur eine der Instanzen des Inkassos.

Neben dem dauerhaften Abonnement gibt es das flüchtige Abonnement. Dabei erhält der Empfänger nur Nachrichten, die eintreffen, während er mit der Nachrichtenplattform verbunden ist. Wie lange die Nachrichtenplattform Nachrichten aufbewahrt und ob sie eine Nachricht nach einem Fehler erneut zustellt, hängt von ihren Einstellungen ab. Nach einer erneuten Zustellung liegt einem Empfänger dieselbe Nachricht zweimal vor, deshalb muss jeder Empfänger doppelte Nachrichten erkennen können. Ein neuer Empfänger wie der Dienst Kundenumfragen erhält alle Nachrichten, die nach der Einrichtung seines Abonnements eintreffen. Ältere Kündigungen erhält der Dienst Kundenumfragen nur, wenn die Nachrichtenplattform sie noch aufbewahrt und das Nachlesen erlaubt.

Publish-Subscribe: eine Kündigung, drei Empfänger, jeder mit eigener Kopie

Beteiligte: Vertragsdienst: Publisher: veröffentlicht einmal; Thema „vertrag“: gibt jedem Abonnement eine eigene Kopie; Inkasso: Subscriber; Kundenportal: Subscriber, dauerhaftes Abonnement; Statistik: Subscriber; Kundenumfragen: neuer Subscriber, später dazu. Ablauf: 1. Der Vertragsdienst veröffentlicht „Vertrag 88123 gekündigt zum 31.12.“ genau einmal im Thema vertrag. 2. Das Inkasso erhält eine eigene Kopie der Nachricht und legt den letzten Beitrag für Dezember fest. 3. Die Statistik erhält ebenfalls eine eigene Kopie und zählt die Kündigung im laufenden Monat. Die Zustellungen an Inkasso und Statistik laufen gleichzeitig und unabhängig voneinander. 4. Das Kundenportal ist wegen Wartungsarbeiten eine Stunde lang nicht erreichbar. 5. Wegen des dauerhaften Abonnements des Kundenportals hebt die Nachrichtenplattform die Kopie für das Kundenportal auf, solange die Aufbewahrungszeit nicht abgelaufen ist. 6. Nach den Wartungsarbeiten stellt die Nachrichtenplattform die Kopie zu, und das Kundenportal zeigt den Vertrag als „gekündigt zum 31. Dezember“ an. 7. Der neue Dienst Kundenumfragen, der Kunden nach ihrer Kündigung befragt, richtet ein Abonnement für das Thema vertrag ein. 8. Der Vertragsdienst veröffentlicht die nächste Kündigung wie bisher, ohne geändert zu werden. 9. Der Dienst Kundenumfragen erhält künftige Kündigungen. Ältere Kündigungen erhält der Dienst Kundenumfragen nur, wenn die Nachrichtenplattform sie noch aufbewahrt.

Wann ist es sinnvoll und wann nicht?

Publish Subscribe lohnt sich

  • Ein Ereignis interessiert mehrere voneinander unabhängige Empfänger. Beispiele sind Kündigungen, Adressänderungen und neue Schadenmeldungen. Eine gewöhnliche Warteschlange hilft dann nicht, weil sie jede Nachricht nur an einen einzigen Empfänger gibt. Die Kündigung erhielte entweder das Inkasso oder das Kundenportal oder die Statistik, aber nicht alle drei. Mit Publish Subscribe erhalten alle drei eine eigene Kopie.
  • Empfänger sollen hinzukommen oder wegfallen, ohne dass der Sender geändert werden muss. Schickt der Vertragsdienst jedem Empfänger eine eigene Nachricht, muss der Vertragsdienst alle Empfänger kennen und direkt ansprechen. Für einen neuen Empfänger wie den Dienst Kundenumfragen müsste das Team des Vertragsdienstes den Vertragsdienst ändern, testen und neu ausliefern, obwohl sich an der Kündigung nichts geändert hat. Mit Publish Subscribe richtet der Dienst Kundenumfragen nur sein eigenes Abonnement ein.
  • Sender und Empfänger werden von verschiedenen Teams entwickelt und zu verschiedenen Zeiten ausgeliefert. Das Team des Vertragsdienstes weiß nicht immer, welche anderen Programme sich für Kündigungen interessieren. Ohne Publish Subscribe erfährt ein Programm, von dem das Team des Vertragsdienstes nichts weiß, nie von einer Kündigung. Mit Publish Subscribe richtet das Team jedes Empfängers das Abonnement seines Programms selbst ein, und das Team des Vertragsdienstes muss die Empfänger nicht kennen.
  • Die Empfänger sind zu unterschiedlichen Zeiten erreichbar und sollen verpasste Nachrichten nachträglich erhalten. Ein Beispiel ist das Kundenportal mit seinen Wartungsarbeiten. Ohne aufbewahrte Kopie würde das Kundenportal die Kündigung von Vertrag 88123 während der Wartung verpassen. Mit dem dauerhaften Abonnement stellt die Nachrichtenplattform die Kopie nach der Wartung zu.

Publish Subscribe ist nicht das Richtige

  • Ein Arbeitsauftrag, etwa ein Zahlungsauftrag, soll von genau einem Bearbeiter ausgeführt werden, und kein anderes Programm braucht davon eine Kopie. Mit Publish Subscribe erhielte jedes Abonnement eine eigene Kopie, und ein zweites Abonnement, das jemand später einrichtet, könnte dieselbe Zahlung ein zweites Mal auslösen. Stattdessen schreibt der Sender den Auftrag in einen Point to Point Channel, eine gemeinsame Warteschlange, die jede Nachricht nur einem Empfänger gibt.
  • Es gibt nur einen oder zwei Empfänger, die sich selten ändern, etwa nur das Inkasso und das Kundenportal. Dass neue Empfänger ohne Änderung am Vertragsdienst hinzukommen können, wird dann kaum gebraucht. Dann baut das Team des Vertragsdienstes direkte Aufrufe dieser Empfänger in den Vertragsdienst ein. Die Nachrichtenplattform, die betrieben, überwacht und eingestellt werden muss, entfällt, und der Vertragsdienst erfährt sofort, ob ein Aufruf gelungen ist. Ist das Kundenportal gerade in Wartung, muss der Vertragsdienst den Aufruf später selbst wiederholen. Für jeden neuen Empfänger muss das Team des Vertragsdienstes den Vertragsdienst außerdem ändern.
  • Der Sender braucht sofort eine Antwort. Ein Beispiel ist die Frage, ob das Inkasso die Kündigung angenommen hat. Auf eine veröffentlichte Nachricht erhält der Vertragsdienst keine Antwort. Dann schickt der Vertragsdienst dem Inkasso eine Anfrage nach Request Reply, und das Inkasso schickt eine Antwort zurück, die dieser Anfrage zugeordnet ist.
  • Sender und Empfänger müssen eine Änderung gemeinsam bestätigen oder gemeinsam verwerfen. Ein Beispiel ist eine Kündigung, die nur gelten darf, wenn das Inkasso sie verbucht hat. Mit Publish Subscribe gilt die Kündigung im Vertragsdienst schon, auch wenn das Inkasso sie nie verbucht. Vertragsdienst und Inkasso stimmen sich deshalb nach Two Phase Commit ab: Ein steuerndes Programm fragt beide, ob sie die Änderung ausführen können, und erst wenn beide zustimmen, speichern beide die Änderung.

Nachteile und typische Fehler

Der Vertragsdienst erfährt nicht, ob und von welchen Empfängern seine Nachricht verarbeitet wurde. Jeder Empfänger liest bestimmte Felder der Nachricht, etwa Vertragsnummer und Kündigungsdatum, auch ein Empfänger, von dem das Team des Vertragsdienstes nichts weiß. Benennt das Team des Vertragsdienstes ein Feld um oder entfernt es, kann ein solcher Empfänger die Nachricht nicht mehr lesen. Jedes Abonnement erhält eine eigene Kopie: Bei vier Abonnements stellt die Nachrichtenplattform jede Kündigung viermal zu. Bei vielen Empfängern und vielen Nachrichten belastet das die Nachrichtenplattform und das Netz. Die Nachrichtenplattform muss betrieben, überwacht und so eingestellt werden, dass die Aufbewahrungszeiten zu den Wartungszeiten der Empfänger passen.

Typische Fehler und woran man sie erkennt:

  • Geänderter Nachrichtenaufbau: Das Team des Vertragsdienstes benennt ein Feld der Nachricht um. Die Nachrichtenplattform stellt die nächste Kündigung im neuen Aufbau allen Abonnements zu. Ein Empfänger, von dem das Team des Vertragsdienstes nichts wusste, kann die Kündigung nicht mehr lesen. Erkennbar ist das an Verarbeitungsfehlern bei einem Empfänger, die genau mit einer neuen Version des Vertragsdienstes beginnen.
  • Wachsender Rückstand: Die Statistik liest dauerhaft langsamer, als Kündigungen eintreffen. Der Rückstand belegt immer mehr Speicherplatz auf der Nachrichtenplattform. Erkennbar ist das an einer stetig steigenden Zahl ungelesener Nachrichten im Abonnement der Statistik.
  • Flüchtiges statt dauerhaftes Abonnement: Das Kundenportal ist versehentlich flüchtig angemeldet. Während der Wartungsarbeiten hebt die Nachrichtenplattform deshalb keine Kopie für das Kundenportal auf, und das Kundenportal erfährt nie von der Kündigung von Vertrag 88123. Erkennbar ist das an Verträgen, die im Kundenportal noch als aktiv erscheinen, obwohl der Vertragsdienst sie gekündigt hat.
  • Überschrittene Aufbewahrungszeit: Die Wartungsarbeiten am Kundenportal dauern länger als die eingestellte Aufbewahrungszeit, und die Nachrichtenplattform verwirft die Kopie. Erkennbar ist das an fehlenden Kündigungen aus genau dem Zeitraum der Wartungsarbeiten.
  • Doppelte Zählung: Die Statistik zählt eine Kündigung und stürzt ab, bevor sie der Nachrichtenplattform den Empfang bestätigt. Die Nachrichtenplattform stellt die Kündigung deshalb erneut zu, und die Statistik zählt sie ein zweites Mal. Erkennbar ist das an mehr Kündigungen in der Statistik, als der Vertragsdienst erfasst hat.

Weiterführend

Verwandte Ansätze

  • Event Driven Architecture: eine Bauweise, in der Programme hauptsächlich über veröffentlichte Ereignisse zusammenarbeiten.
  • Choreography: Abläufe, die entstehen, weil Programme auf die Ereignisse anderer Programme reagieren, ohne zentrale Steuerung.
  • Messaging: der Austausch von Nachrichten über eine Nachrichtenplattform, die Themen bereitstellt.
  • Claim Check: hält Nachrichten klein, indem große Inhalte getrennt abgelegt werden. Das lohnt sich besonders, wenn viele Empfänger eine Nachricht erhalten.

Werkzeuge und Umsetzungen

  • Apache Kafka: Nachrichtenplattform, bei der jede Gruppe von Empfängern ein Thema unabhängig von anderen Gruppen liest. Die Nachrichten bleiben für eine einstellbare Zeit gespeichert und lassen sich erneut lesen.
  • RabbitMQ: Nachrichtenplattform, die Nachrichten über sogenannte Exchanges vom Typ Fanout oder Topic an die Warteschlangen aller Abonnenten kopiert. Ein Exchange ist ein Verteiler innerhalb von RabbitMQ. Ein Exchange vom Typ Fanout kopiert jede Nachricht in alle angeschlossenen Warteschlangen, ein Exchange vom Typ Topic nur in die Warteschlangen, die das passende Thema abonniert haben.
  • Apache Pulsar: Nachrichtenplattform mit Themen und dauerhaften Abonnements.
  • NATS: Nachrichtenplattform, die Nachrichten an alle Abonnenten eines Themas verteilt.
  • Eclipse Mosquitto: Vermittler für MQTT, ein Übertragungsverfahren zum Veröffentlichen und Abonnieren, das oft für Messgeräte und Sensoren genutzt wird.

Quellen