Softwarearchitektur verstehen und entscheiden

Aaron KreisÜber mich
Nachrichten und Ereignisse

Scatter Gather

Anfrage verteilen und Antworten einsammeln

Die Idee und ihr Nutzen

Ein Kunde meldet im Kundenportal seiner Versicherung einen Glasschaden an seinem Auto, Fall 4711. Das Kundenportal soll ihm sofort freie Reparaturtermine von drei Partnerwerkstätten zur Auswahl anzeigen. Statt die Werkstätten nacheinander zu fragen, schickt das Kundenportal die Anfrage an alle drei gleichzeitig. Dann sammelt das Kundenportal die Antworten bis zu einer festgelegten Frist ein und zeigt die bis dahin eingetroffenen Termine gemeinsam an. Die Frist beträgt zum Beispiel zwei Sekunden: Die Werkstätten antworten meist nach weniger als einer Sekunde, und die Frist lässt ihnen den doppelten Spielraum. So wartet der Kunde höchstens bis zum Ende der Frist, auch wenn eine Werkstatt langsam antwortet. Dieses gleichzeitige Verteilen und anschließende Einsammeln heißt Scatter Gather, auf Deutsch Streuen und Sammeln.

Bausteine: Verteiler: schickt die Anfrage an alle Werkstätten gleichzeitig; Werkstatt 1: freie Termine; Werkstatt 2: freie Termine; Werkstatt 3: freie Termine; Sammler: wartet höchstens 2 Sekunden, ordnet nach Fallkennung; Kundenportal: zeigt den Terminvergleich. Verbindungen: Kundenportal → Verteiler (Anfrage); Verteiler → Werkstatt 1; Verteiler → Werkstatt 2; Verteiler → Werkstatt 3; Werkstatt 1 → Sammler; Werkstatt 2 → Sammler; Werkstatt 3 → Sammler; Sammler → Kundenportal (Antworten bis zur Frist). Der Verteiler fragt alle drei Werkstätten gleichzeitig; der Sammler gibt dem Kundenportal die Antworten, die bis zur Frist eingetroffen sind.

Wie funktioniert es?

Das Kundenportal fragt den Verteiler, einen eigenen Programmteil des Kundenportals, nach Terminen für Fall 4711. Der Verteiler schickt drei Anfragen gleichzeitig an Werkstatt 1, 2 und 3, jede mit der Fallkennung 4711. Die Antworten der Werkstätten gehen an den Sammler, einen zweiten Programmteil des Kundenportals, der höchstens zwei Sekunden wartet. Werkstatt 1 antwortet nach 300 Millisekunden mit einem freien Termin am Dienstag, Werkstatt 2 nach 900 Millisekunden mit einem Termin am Mittwoch. Werkstatt 3 ist gerade stark ausgelastet, und von Werkstatt 3 liegt nach zwei Sekunden noch nichts vor. Mit Ablauf der Frist gibt der Sammler dem Kundenportal einen Terminvergleich mit den Terminen am Dienstag und am Mittwoch und den Hinweis „Von Werkstatt 3 liegt noch keine Antwort vor“. Der Kunde sieht diesen Vergleich und kann bereits einen Termin wählen. Drei Sekunden später, also fünf Sekunden nach der Anfrage, trifft die Antwort von Werkstatt 3 ein. Der Sammler erkennt an der Fallkennung 4711, zu welchem Vergleich die Antwort gehört. Nach einer festgelegten Regel verwirft der Sammler die späte Antwort oder ergänzt ausdrücklich den Vergleich für Fall 4711, nie den eines anderen Kunden.

Die drei Werkstätten sind fremde Systeme und beantworten dieselbe Frage jeweils aus ihrem eigenen Terminkalender. Der Verteiler gibt jeder Anfrage die Fallkennung mit, und jede Werkstatt schickt die Fallkennung mit ihrer Antwort zurück. Der Sammler nimmt die Antworten entgegen, ordnet sie anhand der Fallkennung dem richtigen Vergleich zu und hält für jeden offenen Vergleich fest, welche Werkstätten schon geantwortet haben. Fehlt die Antwort einer Werkstatt, vermerkt der Sammler das ausdrücklich, statt einen Termin zu erfinden oder die Werkstatt stillschweigend wegzulassen. Der Kunde soll erkennen, dass eine Werkstatt noch nicht geantwortet hat, statt zu glauben, sie habe keine freien Termine. Vor der ersten Anfrage muss eine Regel feststehen, wann das Ergebnis als vollständig gilt. Der Sammler kann auf alle Antworten warten. Er kann die erste brauchbare Antwort nehmen. Oder er wartet bis zu einer festen Frist und nimmt, was bis dahin da ist, wie beim Terminvergleich. Die gewählte Regel bestimmt, wie lange der Kunde wartet und was mit fehlenden, verspäteten oder widersprüchlichen Antworten geschieht.

Für andere Aufgaben kann die Regel anders lauten, denn eine feste Frist stellt nicht sicher, dass das Ergebnis vollständig ist. Soll ein Schaden zum Beispiel erst freigegeben werden, wenn drei verschiedene Prüfdienste zugestimmt haben, muss der Sammler auf alle Antworten warten.

Scatter-Gather: drei Werkstätten gleichzeitig fragen, nach zwei Sekunden vergleichen

Beteiligte: Kundenportal: zeigt den Terminvergleich; Verteiler: schickt die Anfrage an alle Werkstätten; Werkstatt 1: fremdes System; Werkstatt 2: fremdes System; Werkstatt 3: gerade stark ausgelastet; Sammler: wartet höchstens 2 s, ordnet nach Fallkennung. Ablauf: 1. Das Kundenportal fragt den Verteiler nach Terminen für Fall 4711. 2. Der Verteiler schickt drei Anfragen gleichzeitig, jede mit der Fallkennung 4711, die erste an Werkstatt 1. 3. Gleichzeitig schickt der Verteiler die Anfrage an Werkstatt 2. 4. Ebenso gleichzeitig schickt der Verteiler die Anfrage an Werkstatt 3. 5. Werkstatt 1 antwortet dem Sammler nach 300 Millisekunden mit einem Termin am Dienstag. 6. Werkstatt 2 antwortet dem Sammler nach 900 Millisekunden mit einem Termin am Mittwoch, also innerhalb der Frist. 7. Nach zwei Sekunden endet die Frist des Sammlers. Von Werkstatt 3 liegt noch nichts vor. 8. Der Sammler gibt dem Kundenportal den Terminvergleich mit den Terminen am Dienstag und am Mittwoch und vermerkt die fehlende Antwort von Werkstatt 3. Der Kunde kann schon wählen. 9. Die Antwort von Werkstatt 3 kommt nach fünf Sekunden. An der Fallkennung erkennt der Sammler, zu welchem Vergleich sie gehört. 10. Nach einer festgelegten Regel verwirft der Sammler die späte Antwort oder ergänzt ausdrücklich den Vergleich für Fall 4711, nie den eines anderen Kunden.

Wann ist es sinnvoll und wann nicht?

Scatter Gather lohnt sich

  • Mehrere voneinander unabhängige Systeme können dieselbe Frage beantworten. Beispiele sind der Vergleich von Terminen, Preisen oder Verfügbarkeiten. Ohne Scatter Gather sähe der Kunde nur die Termine einer einzigen Werkstatt und könnte nicht vergleichen.
  • Die Wartezeiten nacheinander gestellter Anfragen würden sich zu einer Zeit addieren, die für den Kunden zu lang ist. Braucht jede Werkstatt eine Sekunde, wartet der Kunde bei drei Werkstätten nacheinander drei Sekunden. Antwortet eine Werkstatt gar nicht, wartet er noch länger, und die Termine der anderen Werkstätten erscheinen erst danach. Mit Scatter Gather wartet der Kunde höchstens bis zum Ende der Frist von zwei Sekunden.
  • Es steht vorab fest, wann das Ergebnis vollständig genug ist. Beim Terminvergleich ist das die Frist von zwei Sekunden, weil dem Kunden die bis dahin eingetroffenen Termine zur Auswahl genügen. Der Sammler gibt den Vergleich dann nach spätestens zwei Sekunden heraus, statt auf eine Werkstatt zu warten, die vielleicht gar nicht antwortet.
  • Weitere Empfänger sollen hinzukommen können, ohne dass die Wartezeit wächst. Nacheinander gefragt, käme mit jeder weiteren Partnerwerkstatt etwa eine Sekunde Wartezeit hinzu. Mit Scatter Gather bleibt die längste Wartezeit des Kunden bei der Frist von zwei Sekunden.

Scatter Gather ist nicht das Richtige

  • Nur ein einziges System kennt die Antwort, etwa wenn die Versicherung für Glasschäden nur mit Werkstatt 1 zusammenarbeitet. Der Verteiler hätte dann nur eine Anfrage zu verschicken und der Sammler nur eine Antwort einzusammeln. Das Kundenportal schickt Werkstatt 1 deshalb selbst eine einzelne Anfrage und wartet höchstens zwei Sekunden auf die Antwort. Verteiler und Sammler entfallen.
  • Die Anfragen müssen nacheinander gestellt werden, weil jede Anfrage das Ergebnis der vorigen braucht. Ein Beispiel: Werkstatt 1 nennt nur dann einen Termin, wenn sie weiß, ab wann ein Glashändler die passende Scheibe liefert. Eine gleichzeitig verschickte Anfrage an Werkstatt 1 enthielte diesen Liefertag noch nicht. Dann stellt das Kundenportal die Anfragen der Reihe nach und gibt jeder Anfrage das Ergebnis der vorigen mit. Verteiler und Sammler entfallen.
  • Am Ende nutzt das Kundenportal ohnehin nur eine Antwort, etwa weil ein einziger passender Termin genügt und schon die erste Werkstatt meist einen hat. Scatter Gather würde trotzdem alle drei Werkstätten fragen, und zwei Antworten blieben meist ungenutzt. Dann fragt das Kundenportal die Werkstätten nacheinander nach dem Muster Request Reply, also mit je einer Anfrage, auf deren Antwort das Kundenportal wartet. Beim ersten passenden Termin hört das Kundenportal auf. Meist erhält so nur eine Werkstatt eine Anfrage statt drei, und Verteiler und Sammler entfallen.
  • Die freien Termine der Werkstätten ändern sich selten. Scatter Gather würde dann bei jeder Terminfrage alle drei Werkstätten fragen, obwohl sich ihre Antworten seit der letzten Frage meist nicht geändert haben. Stattdessen sammelt das Kundenportal die freien Termine in festen Abständen vorab ein und speichert sie als fertige Tabelle, eine Materialized View. Der Kunde wartet dann gar nicht auf die Werkstätten, und die Werkstätten erhalten nicht bei jeder Terminfrage eine Anfrage. Dafür sieht der Kunde womöglich Termine, die inzwischen vergeben sind.

Nachteile und typische Fehler

Mit einer Frist fehlen dem Kunden unter Umständen Termine, die nur etwas zu spät kamen. Die Frist ist deshalb eine fachliche Entscheidung zwischen kurzer Wartezeit und vollständigem Vergleich. Jede Terminfrage erreicht alle drei Werkstätten, auch wenn der Kunde am Ende nur einen Termin wählt. Der Sammler muss für jeden offenen Vergleich festhalten, welche Antworten schon da sind, und diese Angaben löschen, sobald keine späte Antwort mehr zu erwarten ist. Auch doppelt eintreffende Antworten muss der Sammler anhand der Fallkennung erkennen. Antworten können sich auch widersprechen. Ein Beispiel sind unterschiedliche Preise für dieselbe Reparatur. Dann braucht das Kundenportal eine Regel, wie es widersprüchliche Antworten dem Kunden zeigt.

Typische Fehler und woran man sie erkennt:

  • Keine Frist: Der Sammler wartet ohne Frist auf alle drei Antworten. Werkstatt 3 antwortet erst nach fünf Sekunden, und erst dann gibt der Sammler dem Kundenportal den Terminvergleich. Antwortet eine Werkstatt gar nicht, wartet der Kunde unbegrenzt. Erkennbar ist das an Terminvergleichen, die so lange laden, wie die langsamste Werkstatt für ihre Antwort braucht.
  • Falsch zugeordnete Antwort: Der Sammler ordnet jede Antwort dem Vergleich zu, den er gerade zusammenstellt, statt auf die Fallkennung zu achten. Die späte Antwort von Werkstatt 3 zu Fall 4711 trifft ein, während der Sammler schon den Vergleich für einen anderen Kunden zusammenstellt. Der Sammler fügt den Termin von Werkstatt 3 in diesen fremden Vergleich ein. Erkennbar ist das an Terminen in einem Vergleich, die eine Werkstatt für einen anderen Fall angeboten hat.
  • Stillschweigend fehlende Werkstatt: Der Sammler lässt Werkstatt 3 ohne Hinweis weg, und der Kunde glaubt, Werkstatt 3 habe keine freien Termine. Erkennbar ist das an Vergleichen mit weniger Werkstätten als angefragt, ohne einen Vermerk dazu.
  • Liegen gebliebene Vergleiche: Der Sammler räumt offene Vergleiche nie auf, auch dann nicht, wenn keine späte Antwort mehr zu erwarten ist. Erkennbar ist das an einem Speicherverbrauch des Sammlers, der mit jeder Terminfrage wächst.

Weiterführend

Verwandte Ansätze

  • Aggregator: sammelt zusammengehörige Nachrichten und fasst sie zu einer zusammen. Der Sammler im Terminvergleich ist ein solcher Aggregator mit einer Frist von zwei Sekunden.
  • Correlation Identifier: eine mitgereichte Kennung, mit der zusammengehörige Nachrichten erkannt werden, hier die Fallkennung 4711.
  • Publish Subscribe: verteilt eine Nachricht an alle angemeldeten Empfänger. Damit lässt sich die Terminfrage auch an Werkstätten verteilen, die der Verteiler nicht einzeln kennt.
  • Timeout: begrenzt, wie lange auf eine einzelne Antwort gewartet wird. Die Frist des Sammlers begrenzt dagegen die Wartezeit für den ganzen Vergleich.

Quellen

  • Gregor Hohpe, Bobby Woolf: Scatter-Gather: Beschreibung des Musters aus dem Buch Enterprise Integration Patterns, mit den Regeln „auf alle warten“, „erste brauchbare Antwort“ und „feste Frist“ für das Einsammeln.
  • AWS: Scatter-gather pattern: beschreibt Verteilen und Einsammeln mit eindeutiger Kennung je Anfragegruppe, Fristen für späte Antworten und den Hinweis an den Nutzer, wenn ein Ergebnis unvollständig ist.