Softwarearchitektur verstehen und entscheiden

Aaron KreisÜber mich
Nachrichten und Ereignisse

Message Router

Nachrichten nach Regeln an den passenden Kanal leiten

Die Idee und ihr Nutzen

Das Kundenportal einer Versicherung nimmt Schadenmeldungen für Kfz- und für Hausratversicherungen entgegen. Kfz-Schäden bearbeitet das Kfz-Team, Hausratschäden das Hausratteam, und jedes Team holt seine Meldungen aus einem eigenen Nachrichtenkanal. Ein Nachrichtenkanal, kurz Kanal, ist eine benannte Ablage, in die ein Programm Nachrichten legt und aus der ein anderes Programm sie abholt. Das Kundenportal soll die Zuständigkeiten der Teams nicht kennen müssen und schickt deshalb alle Meldungen in einen gemeinsamen Eingangskanal. Ein eigenes Verteilprogramm liest bei jeder Meldung die Sparte, also Kfz oder Hausrat, und leitet die Meldung in den Kanal des zuständigen Teams weiter. Dieses Verteilprogramm heißt Message Router, auf Deutsch Nachrichtenverteiler, kurz Router.

Bausteine: Kundenportal: kennt die Zuständigkeiten nicht; Eingangskanal: alle Schadenmeldungen; Router: liest die Sparte jeder Meldung; Kfz-Kanal: wird vom Kfz-Team gelesen; Hausratkanal: wird vom Hausratteam gelesen. Verbindungen: Kundenportal → Eingangskanal; Eingangskanal → Router; Router → Kfz-Kanal; Router → Hausratkanal. Das Kundenportal kennt nur den Eingangskanal; der Router leitet jede Meldung nach ihrer Sparte in den Kanal des zuständigen Teams.

Wie funktioniert es?

Ein Kunde meldet im Kundenportal einen Auffahrunfall. Das Kundenportal legt die Meldung „Auffahrunfall · sparte: kfz“ in den Eingangskanal schadenmeldungen. Der Router liest die Meldung und findet im Feld sparte den Wert kfz. Nach seiner Regel für diese Sparte legt der Router die Meldung unverändert in den Kfz-Kanal, aus dem das Kfz-Team sie abholt. Eine Stunde später meldet eine Kundin einen Einbruch. Das Kundenportal legt die Meldung „Einbruch · sparte: hausrat“ in denselben Eingangskanal, und der Router legt diese Meldung in den Hausratkanal, den das Hausratteam liest. Jede Meldung geht an genau einen Kanal. Für Meldungen, auf die keine Regel passt, gibt es einen eigenen Fehlerkanal. Trägt eine Meldung eine unbekannte Sparte, legt der Router die Meldung in den Fehlerkanal und löst eine Warnung aus, damit die Meldung nicht stillschweigend verloren geht.

Die Programme der Versicherung tauschen Meldungen als Nachrichten aus, also als Datenpakete, die über die Kanäle einer Nachrichtenplattform laufen. Das Kundenportal legt eine Meldung ab und arbeitet weiter, und das zuständige Team holt die Meldung ab, sobald es bereit ist. Das Kundenportal und die Bearbeitungsprogramme des Kfz-Teams und des Hausratteams rufen einander nicht direkt auf und werden unabhängig voneinander geändert und ausgeliefert. Das Kundenportal und die Teams kennen nur ihre Kanäle, nur der Router kennt die Regeln. Die Regeln pflegt das Team, das den Router betreut. Der Router entscheidet nur, in welchem Kanal eine Meldung landet. Er prüft nicht, ob das zuständige Team die Meldung tatsächlich bearbeitet. Die Regeln können auf verschiedenen Merkmalen beruhen. Eine Regel kann nach der Art der Nachricht entscheiden, etwa Schadenmeldung oder Adressänderung. Eine Regel kann auch nach Zusatzangaben in den Kopfzeilen entscheiden, die vor dem eigentlichen Inhalt der Nachricht stehen, etwa nach dem Namen des absendenden Programms. Eine Regel kann auch nach dem Inhalt entscheiden oder nach äußeren Umständen wie der Uhrzeit oder der Auslastung der Empfänger. Einige Sonderformen haben eigene Namen. Der Content Based Router entscheidet nach dem Inhalt der Nachricht, so wie der Router der Versicherung nach dem Feld sparte. Die Recipient List schickt eine Nachricht an mehrere Empfänger, die der Router für jede Nachricht neu bestimmt. Beim Dynamic Router melden die Empfänger während des Betriebs selbst an, welche Nachrichten sie erhalten wollen, etwa das Kfz-Team alle Meldungen mit sparte: kfz.

Fällt der Router aus, bleiben die Meldungen im Eingangskanal liegen, bis der Router wieder läuft. Die Meldungen gehen dabei nicht verloren, werden aber auch von keinem Team bearbeitet.

Message Router: Meldungen nach Sparte weiterleiten

Beteiligte: Kundenportal: legt jede Meldung in den Eingangskanal; Eingangskanal: schadenmeldungen; Router: liest das Feld „sparte“, Regeln je Sparte; Kfz-Kanal: wird vom Kfz-Team gelesen; Hausratkanal: wird vom Hausratteam gelesen; Fehlerkanal: für Meldungen ohne passende Regel, mit Warnung. Ablauf: 1. Ein Kunde meldet einen Auffahrunfall. Das Kundenportal legt die Meldung „Auffahrunfall · sparte: kfz“ in den Eingangskanal. 2. Der Router liest die Meldung zum Auffahrunfall aus dem Eingangskanal. 3. Der Router findet „kfz“ und legt die Meldung in den Kfz-Kanal. Der Inhalt der Meldung bleibt unverändert. 4. Eine Stunde später meldet eine Kundin einen Einbruch. Das Kundenportal legt die Meldung „Einbruch · sparte: hausrat“ in denselben Eingangskanal. 5. Der Router liest die Meldung zum Einbruch und findet „hausrat“. 6. Der Router legt die Meldung in den Hausratkanal. Jede Meldung geht an genau einen Kanal. 7. Trägt eine Meldung eine unbekannte Sparte, legt der Router sie mit einer Warnung in den Fehlerkanal, statt sie zu verlieren. Für eine neue Sparte ergänzt das Team, das den Router betreut, eine Regel und einen Kanal.

Wann ist es sinnvoll und wann nicht?

Ein Message Router lohnt sich

  • Nachrichten aus einer Quelle müssen an verschiedene Ziele verteilt werden, die sich mit der Zeit ändern. Welche Sparte welches Team bearbeitet, entscheidet die Organisation der Versicherung. Die Zuordnung ändert sich zum Beispiel, wenn Teams umgebildet werden. Ohne Router steht die Zuordnung im Kundenportal und muss bei jeder Umbildung dort geändert werden.
  • Der Absender soll die Zuständigkeiten der Empfänger nicht kennen müssen. Wählt das Kundenportal selbst den richtigen Kanal, muss das Kundenportal alle Zuständigkeiten kennen. Ändert sich eine Zuständigkeit, muss das Kundenportal dann geändert und neu ausgeliefert werden, obwohl sich an der Erfassung der Meldung nichts geändert hat.
  • Neue Sparten kommen hinzu. Im nächsten Jahr bietet die Versicherung zum Beispiel Wohngebäudeversicherungen an. Das Team, das den Router betreut, ergänzt dafür im Router eine Regel für sparte: wohngebaeude und einen neuen Kanal. Ohne Router müsste das Kundenportal den neuen Kanal selbst kennen. Das Kundenportal muss nur geändert werden, wenn es Meldungen für die neue Sparte noch nicht erfassen kann. Dass das Kundenportal alle Meldungen in den Eingangskanal legt, bleibt gleich.
  • Jede Meldung soll in genau einem Kanal landen. Schickt das Kundenportal jede Meldung an beide Teams, muss jedes Team die fremden Meldungen aussortieren, und im schlimmsten Fall bearbeiten beide Teams dieselbe Meldung.
  • Die Zuordnung der Sparten zu Kanälen soll in einem einzigen Programm stehen. Wer wissen will, welcher Kanal die Meldungen mit sparte: hausrat erhält, liest das in den Regeln des Routers nach. Den Code des Kundenportals und der Bearbeitungsprogramme muss dafür niemand durchsuchen.

Ein Message Router ist nicht das Richtige

  • Jede Nachricht soll ohnehin an alle Interessierten gehen, etwa jede Schadenmeldung an ein Statistikprogramm und an ein Archiv, die beide alle Meldungen brauchen. Der Router hätte dann nichts zu entscheiden. Dann legt das Kundenportal jede Meldung in ein Thema, also einen Kanal, aus dem jeder angemeldete Empfänger jede Nachricht erhält. Statistikprogramm und Archiv melden sich für das Thema an. Dieses Vorgehen heißt Publish Subscribe. Ein Router, dessen Regeln jemand pflegen muss, entfällt.
  • Jedes Team soll selbst entscheiden, welche Meldungen es annimmt. Mit Router müsste das Kfz-Team für jede Änderung seiner Zuständigkeit das Team bitten, das den Router betreut, die Regel zu ändern. Dann legt das Kundenportal alle Meldungen in ein gemeinsames Thema, und das Bearbeitungsprogramm jedes Teams filtert die passenden Meldungen heraus. Ändert sich eine Zuständigkeit, ändern nur die betroffenen Teams ihren Filter, ohne das Team, das den Router betreut. Dabei kann es aber vorkommen, dass eine Meldung von keinem oder von zwei Teams angenommen wird.
  • Es gibt nur ein einziges Ziel, und der Router hätte nichts zu verteilen. Dann legt das Kundenportal die Meldung direkt in den Kanal dieses Ziels. Ein Router und ein Eingangskanal, die betrieben und überwacht werden müssen, entfallen.

Nachteile und typische Fehler

Der Router ist ein zusätzliches Programm, das ausfallen kann und überwacht werden muss. Der Router muss alle Ziele kennen. Bei sehr vielen Regeln wird er selbst schwer zu überblicken und zu pflegen, und jede neue Sparte oder geänderte Zuständigkeit bedeutet eine Änderung am Router. Weil alle Meldungen durch den Router laufen, muss er so ausgelegt sein, dass er auch zu Spitzenzeiten alle Meldungen rechtzeitig weiterleitet. Jemand muss den Fehlerkanal lesen und die Meldungen darin von Hand zuordnen.

Typische Fehler und woran man sie erkennt:

  • Ausgefallener Router: Der Router läuft nicht, und alle Meldungen bleiben im Eingangskanal liegen. Erkennbar ist das an einer wachsenden Zahl wartender Nachrichten im Eingangskanal schadenmeldungen, während die Kanäle der Teams leer bleiben.
  • Beliebiges Standardziel: Der Router hat keinen Fehlerkanal. Meldungen, auf die keine Regel passt, legt der Router in einen Standardkanal, den kein Team liest, oder verwirft sie. Das Kundenportal erfasst zum Beispiel schon Meldungen mit sparte: wohngebaeude, bevor das Team, das den Router betreut, die Regel dafür ergänzt hat. Kein Team erfährt von diesen Meldungen, und die gemeldeten Schäden bleiben unbearbeitet. Erkennbar ist das an Kunden, die nachfragen, warum sich niemand um ihren Schaden kümmert.
  • Überlappende Regeln: Zwei Regeln passen auf dieselbe Meldung, und der Router legt die Meldung in beide Kanäle. Eine Regel leitet zum Beispiel alle Meldungen mit sparte: kfz in den Kfz-Kanal. Eine später ergänzte Regel leitet alle Glasschäden in den Hausratkanal. Eine Meldung zu einer gesprungenen Windschutzscheibe passt auf beide Regeln. Erkennbar ist das an Schäden, die von zwei Teams gleichzeitig bearbeitet werden.
  • Fachregeln im Router: Der Router prüft zusätzlich Schadenhöhen oder ändert Felder der Meldung. Der Router berechnet zum Beispiel aus der Schadenhöhe eine Dringlichkeit und schreibt sie in die Meldung. Ändert die Versicherung die Grenze für dringende Schäden, muss das Team, das den Router betreut, den Router ändern und neu ausliefern, obwohl sich an der Verteilung nichts ändert. Erkennbar ist das, wenn jede fachliche Änderung auch eine Änderung am Router erfordert.
  • Unbeachteter Fehlerkanal: Der Router löst für jede Meldung im Fehlerkanal eine Warnung aus, aber die Warnung geht an ein Postfach, das niemand liest. Niemand ordnet die Meldungen im Fehlerkanal von Hand zu. Erkennbar ist das an Meldungen, die seit Tagen im Fehlerkanal liegen.

Weiterführend

Verwandte Ansätze

  • Content Based Routing: die Form des Routers, die nach dem Inhalt einer Nachricht entscheidet, ausführlich beschrieben.
  • Message Translator: wandelt Nachrichten in ein anderes Format um, statt sie weiterzuleiten. Router und Message Translator werden oft hintereinander eingesetzt.
  • Pipes and Filters: beschreibt Verarbeitungsketten aus einzelnen Schritten. Ein Router kann eine Kette in mehrere Zweige aufteilen.

Werkzeuge und Umsetzungen

  • Apache Camel: enthält alle genannten Formen von Routern als fertige Bausteine.
  • Spring Integration: bietet Router für Java-Anwendungen, die nach Nachrichtenart, Kopfzeilen oder eigenem Code entscheiden.
  • RabbitMQ: Nachrichtenplattform, deren Verteiler, sogenannte Exchanges, Nachrichten nach Regeln an Warteschlangen weiterleiten.
  • Apache NiFi: leitet Datenflüsse über eine grafische Oberfläche nach Merkmalen an verschiedene Ziele.

Quellen