Competing Consumers
Mehrere Empfänger teilen sich eine Warteschlange
Die Idee und ihr Nutzen
Nach einem Hagelsturm gehen bei einer Versicherung innerhalb weniger Minuten 20.000 Schadenmeldungen mit Fotos ein. Ein Bildprüfprogramm wertet die Fotos aus und braucht dafür etwa drei Sekunden je Meldung. Allein bräuchte es für alle Meldungen fast 17 Stunden. Deshalb legt die Versicherung alle Meldungen in eine gemeinsame Warteschlange, und 50 gleichartige Exemplare des Bildprüfprogramms holen sich daraus jeweils die nächste freie Meldung. So ist der Rückstau nach etwa einer halben Stunde abgebaut statt nach fast 17 Stunden. Weil die Exemplare um die Meldungen konkurrieren und jede Meldung nur eines von ihnen erhält, heißt das Verfahren Competing Consumers, auf Deutsch konkurrierende Empfänger.
Wie funktioniert es?
Nach dem Hagelsturm liegen 20.000 Meldungen in der Warteschlange, einem Zwischenspeicher, in den ein Programm Aufträge legt und aus dem andere Programme sie der Reihe nach abholen. Das Betriebsteam startet 50 Bildprüfer, also 50 Exemplare des Bildprüfprogramms. Mehr Exemplare würden die Ergebnisdatenbank überlasten, in die alle Bildprüfer ihre Ergebnisse schreiben. Rechnerisch brauchen die 50 Bildprüfer zusammen mindestens 20 Minuten, denn 20.000 Meldungen mal drei Sekunden ergeben 60.000 Sekunden, und verteilt auf 50 Bildprüfer sind das 1.200 Sekunden. Tatsächlich dauert es etwas länger, weil das Laden der Fotos und schwankende Bearbeitungszeiten hinzukommen. Bildprüfer 1 ist frei und fragt nach der nächsten Meldung. Die Nachrichtenplattform, das Programm, das die Warteschlange führt, gibt Bildprüfer 1 die Meldung 8.311 und markiert die Meldung als „in Bearbeitung“. Andere Bildprüfer bekommen Meldung 8.311 vorerst nicht. Gleichzeitig holt sich Bildprüfer 2 eine Meldung und erhält Meldung 8.312. Bildprüfer 1 wertet die Fotos aus, speichert das Ergebnis in der Ergebnisdatenbank und schickt der Nachrichtenplattform eine Bestätigung. Erst danach entfernt die Nachrichtenplattform Meldung 8.311 endgültig. Bildprüfer 2 dagegen stürzt mitten in der Auswertung ab und schickt keine Bestätigung. Die Nachrichtenplattform wartet höchstens fünf Minuten auf eine Bestätigung und gibt Meldung 8.312 danach wieder frei. Eine Meldung mit vielen großen Fotos kann bis zu drei Minuten dauern; die Frist ist so lang, dass die Nachrichtenplattform eine solche Meldung nicht ein zweites Mal vergibt, während ein Bildprüfer noch daran arbeitet. Bildprüfer 3 fragt nach Arbeit und erhält die liegengebliebene Meldung 8.312. Hatte Bildprüfer 2 vor dem Absturz schon ein Teilergebnis gespeichert, überschreibt Bildprüfer 3 das Teilergebnis mit dem vollständigen Ergebnis und bestätigt danach. Der Kunde von Meldung 8.312 erhält seine Bewertung einige Minuten später als andere, aber die Bewertung geht nicht verloren.
Das Kundenportal, über das die Kunden ihre Schäden melden, legt die Schadenmeldungen in die Warteschlange. Die Nachrichtenplattform nimmt die Meldungen an und bewahrt sie auf. Sie schickt die Meldungen aber nicht von sich aus an die Bildprüfer. Jeder Bildprüfer fragt selbst nach Arbeit, sobald er mit seiner vorigen Meldung fertig ist. Im Verfahren heißen die Bildprüfer Empfänger. Die Nachrichtenplattform gibt jede Meldung jeweils nur einem Empfänger. So holt sich ein Bildprüfer, der gerade eine Meldung mit vielen großen Fotos auswertet, erst danach die nächste Meldung, und die übrigen Bildprüfer bearbeiten in dieser Zeit mehr Meldungen. Das setzt voraus, dass sich jede Meldung für sich bewerten lässt, ohne die anderen Meldungen heranzuziehen. Wird die Warteschlange länger, startet das Betriebsteam weitere Bildprüfer; wird sie kürzer, beendet es welche.
Ein Bildprüfer kann das Ergebnis speichern und abstürzen, bevor er die Bestätigung schickt. Dann bearbeitet ein zweiter Bildprüfer dieselbe Meldung noch einmal. Auch wenn ein Bildprüfer nur sehr langsam ist und die Frist überschreitet, können zwei Bildprüfer dieselbe Meldung gleichzeitig bearbeiten. Competing Consumers sagt also nicht zu, dass jede Meldung nur einmal bearbeitet wird. Die Auswertung muss deshalb so gebaut sein, dass eine doppelte Bearbeitung kein doppeltes Ergebnis erzeugt. Die Bildprüfer überschreiben dafür ein vorhandenes Ergebnis für dieselbe Meldungsnummer, statt ein zweites anzulegen.
Konkurrierende Empfänger: Hagelmeldungen teilen und erneut zustellen
Wann ist es sinnvoll und wann nicht?
Competing Consumers lohnt sich
- Viele gleichartige Aufträge fallen an, die unabhängig voneinander bearbeitet werden können. Jede der 20.000 Schadenmeldungen lässt sich für sich bewerten. Ohne Competing Consumers arbeitet ein einziges Bildprüfprogramm alle Meldungen nacheinander ab.
- Die Menge der Aufträge schwankt stark. An einem ruhigen Tag kommen wenige hundert Meldungen, nach einem Unwetter Zehntausende innerhalb weniger Minuten. Mit nur einem Bildprüfprogramm wird die Warteschlange dann immer länger, und jeder Kunde wartet immer länger auf die Bewertung seines Schadens. Mit Competing Consumers kann das Betriebsteam nach dem Hagelsturm 50 Bildprüfer starten und an ruhigen Tagen mit einem einzigen auskommen.
- Ein einzelnes Programm lässt sich nicht weit genug beschleunigen. Selbst auf einem doppelt so schnellen Rechner bräuchte ein einzelnes Bildprüfprogramm für die 20.000 Meldungen noch mehr als acht Stunden.
- Ein einzelner Empfänger soll nicht die ganze Bearbeitung zum Stillstand bringen können. Mit nur einem Bildprüfprogramm bleibt bei dessen Ausfall die gesamte Arbeit liegen. Mit mehreren Bildprüfern hält der Absturz von Bildprüfer 2 die übrigen 49 Bildprüfer nicht auf.
- Das Kundenportal soll Meldungen ablegen können, ohne auf die Bewertung zu warten. So bleibt das Kundenportal auch bei 20.000 Meldungen in wenigen Minuten erreichbar. Müsste das Kundenportal bei jeder Meldung die drei Sekunden für die Bewertung abwarten, wäre es nach dem Hagelsturm bald überlastet.
Competing Consumers ist nicht das Richtige
- Die Reihenfolge ist wichtig. Ein Beispiel sind mehrere Meldungen zum selben Vertrag, die in der Reihenfolge ihres Eingangs bearbeitet werden müssen. Mehrere Empfänger arbeiten gleichzeitig und werden unterschiedlich schnell fertig. Erhält Bildprüfer 1 die erste und Bildprüfer 2 die zweite Meldung zum selben Vertrag, kann Bildprüfer 2 zuerst fertig sein. Stattdessen stellt das Betriebsteam die Nachrichtenplattform nach Message Ordering ein: Die Nachrichtenplattform legt alle Meldungen mit derselben Vertragsnummer in denselben Teilstrang der Warteschlange. Immer nur ein Empfänger liest einen Teilstrang, und zwar der Reihe nach. So bearbeitet kein Empfänger eine spätere Meldung zu einem Vertrag vor einer früheren.
- Jede Nachricht soll an mehrere verschiedene Programme gehen, zum Beispiel an das Bildprüfprogramm und an ein Statistikprogramm. Mit Competing Consumers erhielte jede Meldung nur eines dieser Programme. Stattdessen stellt die Nachrichtenplattform jede Meldung nach Publish Subscribe jedem angemeldeten Programm zu.
- Die Auswertung lässt sich nicht so bauen, dass eine doppelte Bearbeitung unschädlich ist. Ein Beispiel ist ein Durchlauf, der jedes Mal eine Zahlung auslöst, ohne dass sich Doppelungen prüfen lassen. Mit konkurrierenden Empfängern könnten zwei Empfänger dieselbe Zahlung gleichzeitig auslösen, etwa wenn ein langsamer Empfänger die Frist überschreitet. Stattdessen löst ein einziges Programm die Zahlungen aus. Stürzt dieses Programm ab, prüft ein Sachbearbeiter den unterbrochenen Auftrag, bevor das Programm weiterarbeitet.
- Ein einzelner Empfänger reicht für die übliche Menge, und bei Lastspitzen dürfen die Aufträge warten, bis dieser eine Empfänger sie abgearbeitet hat. Dann legt das Kundenportal die Meldungen in eine Warteschlange, aus der ein einziges Bildprüfprogramm sie der Reihe nach abholt und den Rückstau nach und nach abarbeitet. Das Betriebsteam muss keine weiteren Exemplare starten und beenden und keine Regel dafür festlegen. Nach einem Hagelsturm mit 20.000 Meldungen warten die Kunden dann aber bis zu 17 Stunden auf ihre Bewertung.
- Ein großer Auftrag soll in Teile zerlegt werden, und die Ergebnisse der Teile sollen wieder zusammengeführt werden. Bei Competing Consumers gibt es kein Programm, das Ergebnisse zusammenführt, denn jeder Empfänger speichert nur das Ergebnis seiner eigenen Meldung. Stattdessen zerlegt nach Master Worker ein steuerndes Programm, der Master, den Auftrag, verteilt die Teile an mehrere Worker und führt deren Ergebnisse zusammen.
Nachteile und typische Fehler
Die Reihenfolge ist nicht mehr gesichert: Meldung 8.312 kann vor Meldung 8.311 fertig sein. Mehr Empfänger belasten auch die Systeme stärker, die jeder Empfänger aufruft, etwa die Ergebnisdatenbank, in die alle Bildprüfer ihre Ergebnisse schreiben. Die Nachrichtenplattform ist ein zusätzliches Programm, das betrieben und überwacht werden muss. Die Frist bis zur erneuten Freigabe muss zur Bearbeitungszeit passen. Ist sie zu lang, wartet ein Kunde nach einem Absturz unnötig lange. Auch für die Zahl der Empfänger braucht es eine Regel, wann weitere gestartet und wann welche beendet werden, etwa abhängig von der Länge der Warteschlange.
Typische Fehler und woran man sie erkennt:
- Doppelte Ergebnisse: Die Bildprüfer legen bei jeder Bearbeitung ein neues Ergebnis an, statt ein vorhandenes Ergebnis für dieselbe Meldungsnummer zu überschreiben. Ein Bildprüfer speichert ein Ergebnis und stürzt ab, bevor er die Bestätigung schickt. Nach Ablauf der Frist bearbeitet ein zweiter Bildprüfer dieselbe Meldung und speichert ein zweites Ergebnis. So entstehen zwei Bewertungen für denselben Schaden. Erkennbar ist das an mehreren Bewertungen mit derselben Meldungsnummer in der Ergebnisdatenbank.
- Giftige Meldung: Ein beschädigtes Foto in einer Meldung bringt jeden Bildprüfer zum Absturz, der die Meldung bearbeitet. Nach jedem Absturz gibt die Nachrichtenplattform die Meldung nach Ablauf der Frist wieder frei, und der nächste Bildprüfer erhält sie. So wandert die Meldung von Bildprüfer zu Bildprüfer, bis die Nachrichtenplattform sie nach einigen Versuchen aussortiert. Ohne diese Grenze legt die Meldung nach und nach alle Bildprüfer lahm. Erkennbar ist das an wiederholten Abstürzen verschiedener Empfänger mit derselben Meldungsnummer.
- Zu kurze Frist: Die Frist bis zur erneuten Freigabe ist kürzer als die übliche Bearbeitungszeit. Die Nachrichtenplattform gibt Meldungen frei, die noch bearbeitet werden, und zwei Empfänger arbeiten gleichzeitig an derselben Meldung. Erkennbar ist das an vielen erneuten Zustellungen, obwohl kein Empfänger abgestürzt ist.
- Überlastete Datenbank: Das Betriebsteam startet 100 statt 50 Bildprüfer, ohne zu prüfen, ob die Ergebnisdatenbank die zusätzlichen Schreibzugriffe bewältigt. Die Ergebnisdatenbank kann aber nur die Ergebnisse von etwa 50 Bildprüfern gleichzeitig speichern. Die Bildprüfer warten dann auf die Ergebnisdatenbank, und der Rückstau baut sich trotz doppelt so vieler Bildprüfer nicht schneller ab. Erkennbar ist das an langen Schreibzeiten der Ergebnisdatenbank bei gleichbleibender Länge der Warteschlange.
Weiterführend
Verwandte Ansätze
- Point to Point Channel: ein Nachrichtenkanal, bei dem jede Nachricht nur einem Empfänger zugestellt wird. Competing Consumers nutzt einen solchen Kanal.
- Dead Letter Queue: eine eigene Ablage für Nachrichten, deren Bearbeitung immer wieder scheitert.
- Idempotency: beschreibt, wie ein Vorgang so gebaut wird, dass eine doppelte Bearbeitung kein doppeltes Ergebnis erzeugt.
- Autoscaling: passt die Zahl der Empfänger automatisch an die Länge der Warteschlange an.
Werkzeuge und Umsetzungen
- RabbitMQ: Nachrichtenplattform, bei der sich mehrere Empfänger eine Warteschlange teilen. Welcher Empfänger die nächste Nachricht erhält, hängt unter anderem davon ab, wie viele Nachrichten er gerade in Bearbeitung hat; eine feste Reihenfolge der Empfänger ist nicht zugesagt.
- Apache Kafka: verteilt die Nachrichten auf getrennte Teilstränge, die Partitionen. Innerhalb einer Empfängergruppe wird jede Partition genau einem Empfänger zugeteilt.
- Apache ActiveMQ Artemis: Nachrichtenplattform mit Warteschlangen, aus denen mehrere Empfänger konkurrierend lesen.
- KEDA: startet zusätzliche Empfänger, wenn eine Warteschlange wächst. KEDA läuft in Kubernetes, einer verbreiteten Plattform zum Betrieb von Anwendungen auf vielen Servern.
- Celery: verteilt Aufgaben in Python-Programmen über eine Warteschlange auf viele Empfänger.
Quellen
- Bobby Woolf: Competing Consumers: beschreibt das Muster aus dem Buch Enterprise Integration Patterns mit mehreren Empfängern an einem Kanal, bei dem jede Nachricht nur einer erhält, und nennt die Grenzen bei Kafka.
- Microsoft: Competing Consumers pattern: nennt Reihenfolge, doppelte Bearbeitung, fehlerhafte Nachrichten und das Ablegen von Ergebnissen als Punkte, die bei der Umsetzung zu bedenken sind.