Bei der Verwendung von RabbitMQ gibt es einige Geschäftsszenarien, bei denen eine sequenzielle Verarbeitung erforderlich ist. Zum Beispiel in einem Szenario, in dem drei Nachrichten generiert werden, um Daten hinzuzufügen, zu ändern und zu löschen. Wenn die Reihenfolge der Verarbeitung nicht garantiert ist, kann es passieren, dass die Ausführungsreihenfolge zu "löschen, ändern, hinzufügen" wird, was zu Unordnung führt.

Wie unten gezeigt:

Das Problem der Nachrichtenreihenfolge in RabbitMQ muss in drei Aspekten betrachtet werden: die Reihenfolge des Sendens von Nachrichten, die Reihenfolge der Nachrichten in der Warteschlange und die Reihenfolge der Nachrichtenverarbeitung.

Reihenfolge des Sendens von Nachrichten

Bei den meisten Geschäften ist die Reihenfolge der Nachrichtenübertragung am Senderende nicht streng. Es ist nicht wichtig, wer die Nachricht zuerst sendet. Wenn ein Geschäft erfordert, dass Nachrichten in Ordnung gesendet werden, bedeutet das, dass nur eine Nachricht zur gleichen Zeit mit einer globalen Sperre gesendet werden kann und Nachrichten nicht gleichzeitig gesendet werden können.

Reihenfolge der Nachrichten in der Warteschlange

Bei RabbitMQ werden Nachrichten letztendlich in einer Warteschlange gespeichert. Innerhalb derselben Warteschlange werden Nachrichten nach dem Prinzip "First In, First Out" geordnet, was von RabbitMQ garantiert wird und normalerweise keine Sorge für Entwickler darstellt.

Hinweis: Die Reihenfolge der Nachrichten in verschiedenen Warteschlangen ist nicht garantiert. Wenn Sie z.B. in eine U-Bahn-Station eintreten und sich einer von drei Warteschlangen anschließen, kann die Reihenfolge des Eintritts in die Station zwischen verschiedenen Warteschlangen nicht garantiert werden.

Reihenfolge der Nachrichtenverarbeitung

Wenn es um die Sicherstellung der Nachrichtenreihenfolge geht, beziehen wir uns im Allgemeinen auf die Reihenfolge, in der Verbraucher Nachrichten verarbeiten. In Szenarien, in denen mehrere Verbraucher Nachrichten aus derselben Nachrichtenwarteschlange verbrauchen, ist es normalerweise nicht möglich, die Nachrichtenreihenfolge zu garantieren. Wie im Eingangsdiagramm angegeben, obwohl die Nachrichten in der Nachrichtenwarteschlange geordnet sind, können mehrere Verbraucher gleichzeitig Nachrichten verbrauchen. Die Geschwindigkeit, mit der Nachrichten abgerufen werden, die Geschwindigkeit der Ausführung von Geschäftslogik und mögliche Ausführungsausnahmen können alle zu inkonsistenter Nachrichtenreihenfolge führen.

Zum Beispiel: Nachrichten A, B und C gelangen nacheinander in die Warteschlange. Verbraucher A1 erhält Nachricht A und Verbraucher B1 erhält Nachricht B. Wenn jedoch Verbraucher B1 schneller ausgeführt wird, kann er vor Verbraucher A1 fertig werden, oder wenn Verbraucher A1 auf einen Fehler stößt, können beide Szenarien zu inkonsistenter Nachrichtenreihenfolge führen.

Die typische Lösung für das Problem der sequenziellen Verarbeitung besteht darin, dass eine Warteschlange nur einen Verbraucher hat Auf diese Weise können Nachrichten nacheinander in Reihenfolge verarbeitet werden. Der Nachteil ist, dass die gleichzeitige Verarbeitungsfähigkeit abnimmt und eine gleichzeitige Nachrichtenverarbeitung nicht möglich ist. Dies ist ein Kompromiss.

Hinweis: Wenn das Geschäft eine sequenzielle Verarbeitung und eine erhöhte Parallelität erfordert, ist ein üblicher Ansatz, mehrere Warteschlangen zu aktivieren. Das Geschäft kann Nachrichten basierend auf Regeln an verschiedene Warteschlangen verteilen, um so das Parallelitätsniveau zu erhöhen. Zum Beispiel ist es in einem E-Commerce-Bestellszenario nur notwendig, die Reihenfolge der Nachrichten für denselben Benutzer sicherzustellen. Nachrichten, die verschiedenen Benutzern gehören, können an verschiedene Warteschlangen geleitet werden.