


[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?
Jul 26, 2023 pm 02:58 PM
1. Einführung
Unsere Freunde sollten genug über Message Middleware MQ geh?rt haben, wie zum Beispiel: RabbitMQ, RocketMQ, Kafka usw. Die Vorteile der Einführung von Middleware k?nnen dazu beitragen, hoher Parallelit?t, Peaking und Gesch?ftsentkopplung entgegenzuwirken.
![[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?](https://img.php.cn/upload/article/001/273/690/f852e96ec4ede8017b2939233ca31b59-2.jpg)
Wie oben gezeigt:
(1) Der Bestelldienst übermittelt Nachrichten an die MQ-Middleware. (2) Der Logistikdienst überwacht die MQ-Middleware-Nachrichten auf Verbrauch.
Lassen Sie uns in diesem Artikel besprechen, wie der Bestelldienst sichergestellt werden kann Am Beispiel von RabbitMQ wird die Nachricht erfolgreich an die MQ-Middleware übermittelt.
2. Analyse des Problems
Meine Freunde haben m?glicherweise einige Fragen dazu. Wenn der Bestelldienst den Nachrichtendienst initiiert, bedeutet das nicht Erfolg, wenn die Rücksendung erfolgreich ist? Zum Beispiel der folgende Pseudocode:
![[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?](https://img.php.cn/upload/article/001/273/690/905609ce0cc6322832dab4f86e7a7ed2-3.jpg)
Im obigen Code werden Nachrichten im Allgemeinen so gesendet. Glauben Sie, dass es ein Problem gibt?
Lassen Sie uns unten über ein Szenario sprechen. Was passiert, wenn der MQ-Server pl?tzlich ausf?llt? Sind alle Nachrichten unseres Bestellservices verschwunden? Ja, im Allgemeinen speichert die MQ-Middleware Nachrichten im Speicher, um den Durchsatz des Systems zu verbessern. Wenn keine andere Verarbeitung erfolgt, gehen alle Nachrichten verloren, sobald der MQ-Server ausf?llt. Dies wird vom Unternehmen nicht zugelassen und wird gro?e Auswirkungen haben.
3. Persistenz
Ich wei?, dass es beim Senden einer Nachricht einen dauerhaften Parameter gibt, der auf ?true“ gesetzt werden kann , es wird Persistenz.
![[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?](https://img.php.cn/upload/article/001/273/690/905609ce0cc6322832dab4f86e7a7ed2-4.jpg)
In diesem Fall werden die Nachrichten auch bei einem Ausfall des MQ-Servers nach dem Neustart in der Festplattendatei gespeichert, sodass sie nicht verloren gehen. Ja, dadurch wird sichergestellt, dass die Nachricht mit einer gewissen Wahrscheinlichkeit nicht verloren geht.
Aber es wird ein Szenario geben, in dem die Nachricht gerade im MQ-Speicher gespeichert wurde, aber bevor sie in der Festplattendatei aktualisiert werden kann, stürzt sie pl?tzlich ab. (Verdammt, das wird in so kurzer Zeit passieren. Die Wahrscheinlichkeit ist zu gering.) Dieses Szenario wird im Prozess der kontinuierlichen Nachrichtenzustellung in gro?em Ma?stab sehr h?ufig auftreten.
Was tun? Wie k?nnen wir sicherstellen, dass es auf der Festplatte gespeichert bleibt?
4. Mechanismus best?tigen
Das obige Problem entsteht, weil uns niemand sagt, ob Persistenz erfolgreich ist. Glücklicherweise verfügen viele MQs über Rückrufbenachrichtigungsfunktionen und RabbitMQ verfügt über einen Best?tigungsmechanismus, der uns benachrichtigt, ob die Persistenz erfolgreich ist.
![[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?](https://img.php.cn/upload/article/001/273/690/21e84d146b7e6f7efb17ced97484e602-5.jpg)
Prinzip des Best?tigungsmechanismus:
Der obige Pseudocode verfügt über zwei M?glichkeiten, Nachrichten zu verarbeiten, n?mlich Best?tigungsrückruf und Nack-Rückruf.(1) Der Nachrichtenproduzent sendet die Nachricht an MQ. Wenn der Empfang erfolgreich ist, sendet MQ eine Best?tigungsnachricht an den Produzenten zurück ist nicht erfolgreich, MQ Eine Nack-Nachricht wird an den Produzenten zurückgegeben
![[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?](https://img.php.cn/upload/article/001/273/690/21e84d146b7e6f7efb17ced97484e602-6.jpg)
Ist dadurch sichergestellt, dass nicht 100 % der Nachrichten verloren gehen?
Werfen wir einen Blick auf den Best?tigungsmechanismus? Stellen Sie sich vor, jedes Mal, wenn unser Produzent eine Nachricht sendet, muss MQ auf der Festplatte gespeichert werden und dann einen Best?tigungs- oder Nack-Rückruf initiieren. In diesem Fall ist der Durchsatz unseres MQ sehr gering, da die Nachricht jedes Mal auf der Festplatte gespeichert werden muss. Das Schreiben auf die Festplatte ist sehr langsam. Dies ist in Szenarien mit hoher Parallelit?t nicht akzeptabel und der Durchsatz ist zu gering.
Die eigentliche Implementierung der persistenten MQ-Festplatte erfolgt über einen bestimmten Mechanismus. Wenn beispielsweise Tausende von Nachrichten vorhanden sind, werden diese auf einmal geleert. Anstatt die Festplatte jedes Mal zu leeren, wenn eine Nachricht eingeht.
Der Best?tigungsmechanismus ist also tats?chlich ein asynchroner Abh?rmechanismus, der den hohen Durchsatz des Systems sicherstellen soll. Dies bedeutet, dass die Nachricht nicht zu 100 % verloren geht, denn selbst wenn der Best?tigungsmechanismus hinzugefügt wird , die Nachricht befindet sich immer noch im MQ-Speicher. Der Computer ist ohne Flashen auf die Festplatte abgestürzt und kann immer noch nicht bearbeitet werden.
Nachdem ich so viel gesagt habe, kann ich es immer noch nicht garantieren. Was soll ich also tun? ? ?
5. Nachrichtenpersistenz im Voraus + geplante Aufgaben
Tats?chlich ist der wesentliche Grund, dass es unm?glich ist, festzustellen, ob sie persistiert? K?nnen wir die Botschaft also selbst dauerhaft machen? Die Antwort lautet: Ja, unser Plan wird sich weiterentwickeln.
![[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?](https://img.php.cn/upload/article/001/273/690/21e84d146b7e6f7efb17ced97484e602-7.jpg)
Der Prozess im obigen Bild:
(1) Vor der übermittlung der Nachricht übertr?gt der Bestelldienstersteller die Nachricht zun?chst an Redis oder Redis, um eine hohe Leistung zu erzielen. Der Status der Nachricht ist Wird gesendet.
(2) Wurde die überwachungsnachricht des Best?tigungsmechanismus erfolgreich gesendet? Wenn die Best?tigung erfolgreich ist, l?schen Sie diese Nachricht in Redis.
(3) Wenn Nack fehlschl?gt, k?nnen Sie w?hlen, ob Sie die Nachricht je nach Ihrem eigenen Unternehmen erneut senden m?chten. Abh?ngig von Ihrer gesch?ftlichen Entscheidung k?nnen Sie diese Nachricht auch l?schen.
(4) Hier wird eine geplante Aufgabe hinzugefügt, um die Nachricht nach einer bestimmten Zeitspanne abzurufen. Der Nachrichtenstatus wird immer noch gesendet. Dieser Status zeigt an, dass der Bestelldienst die Best?tigungs-Erfolgsnachricht nicht erhalten hat.
(5) Geplante Aufgaben liefern kompensatorische Nachrichten. Wenn zu diesem Zeitpunkt die MQ-Rückrufbest?tigung erfolgreich empfangen wird, wird die Nachricht in Redis gel?scht.
Dieser Mechanismus ist eigentlich ein Kompensationsmechanismus. Es ist mir egal, ob MQ ihn tats?chlich empf?ngt. Solange der Nachrichtenstatus in meinem Redis [Sendet] lautet, bedeutet dies, dass die Nachricht nicht erfolgreich korrekt zugestellt wurde. Starten Sie dann die geplante Aufgabe zur überwachung und Einleitung der Entsch?digungslieferung.
Natürlich k?nnen wir auch eine Kompensationsnummer für die geplante Aufgabe hinzufügen und immer noch keine Best?tigungsnachricht erhalten, dann setzen Sie den Status der Nachricht direkt auf [Fehlgeschlagen] und lassen Sie die Leute manuell überprüfen, warum ?
In diesem Fall ist die L?sung perfekter und stellt sicher, dass 100 % der Nachrichten nicht verloren gehen (dabei ist der Festplattenausfall natürlich nicht berücksichtigt, sodass eine Master-Slave-L?sung verwendet werden kann).
Mit dieser L?sung ist es jedoch m?glich, dieselbe Nachricht mehrmals zu senden. Es ist sehr wahrscheinlich, dass MQ die Nachricht bereits empfangen hat, beim Rückruf der Best?tigungsnachricht jedoch ein Netzwerkfehler aufgetreten ist, der Produzent jedoch nicht Erhalte es.
Dann müssen wir von Verbrauchern verlangen, beim Konsum auf Idempotenz zu achten!
Sechs, die Bedeutung von Idempotenz
Lassen Sie uns zun?chst verstehen, was Idempotenz ist. In verteilten Anwendungen ist Idempotenz sehr wichtig. Das hei?t, wenn ein Unternehmen unter denselben Bedingungen betrieben wird, ist das Ergebnis dasselbe, unabh?ngig davon, wie oft es ausgeführt wird.
6.1. Warum gibt es ein solches Szenario wie idempotent?
Warum gibt es ein Szenario wie idempotent? Denn in gro?en Systemen werden sie alle verteilt eingesetzt. Beispielsweise k?nnen Auftragsgesch?ft und Lagergesch?ft unabh?ngig voneinander eingesetzt werden und sind separate Dienste. Wenn ein Benutzer eine Bestellung aufgibt, werden der Bestellservice und der Lagerservice aufgerufen.
![[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?](https://img.php.cn/upload/article/001/273/690/7f9e506a95a9be69dfb9b373d1a8cf52-8.jpg)
Aufgrund der verteilten Bereitstellung ist es sehr wahrscheinlich, dass der Aufruf des Bestellservices aus Netzwerk- und anderen Gründen fehlschl?gt. Tats?chlich wurde der Inventarservice jedoch verarbeitet, bei der Verarbeitung ist jedoch eine Ausnahme aufgetreten Das Ergebnis wurde an den Bestellservice zurückgegeben. Zu diesem Zeitpunkt erstellt das System im Allgemeinen einen Vergütungsplan, d. h. der Bestelldienst ruft dann den Lagerdienst an und der Lagerbestand wird um 1 reduziert.
![[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?](https://img.php.cn/upload/article/001/273/690/7f9e506a95a9be69dfb9b373d1a8cf52-9.png)
Es liegt tats?chlich ein Problem vor, der letzte Anruf wurde um 1 reduziert, aber der Bestellservice hat das Bearbeitungsergebnis nicht erhalten. Jetzt wird es erneut aufgerufen und muss um 1 reduziert werden. Dies entspricht nicht dem Gesch?ft und ist ein zus?tzlicher Abzug.
Das Konzept der Idempotenz besteht darin, dass das Verarbeitungsergebnis dasselbe ist, egal wie oft der Inventardienst unter denselben Bedingungen aufgerufen wird. Nur so kann die Durchführbarkeit des Vergütungsplans sichergestellt werden. 6.2. Optimistisches Sperrschema Führen Sie die Bestandsaufnahme durch und bringen Sie dann diese Versionsnummer mit. Lassen Sie uns das kl?ren. Als wir die Inventur zum ersten Mal durchführten, bekamen wir Version 1, und als wir den Inventurservice anriefen, gab es ein Problem, als wir zum Bestellservice zurückkehrten Wenn der Bestelldienst als Version übergeben wird und die obige SQL-Anweisung erneut ausgeführt wird, wird sie nicht ausgeführt, da die Version auf 2 ge?ndert wurde. Dies stellt sicher, dass es, egal wie oft es aufgerufen wird, nur einmal tats?chlich verarbeitet wird.
6.3. Eindeutige ID + Fingerabdruckcode
Das Prinzip besteht darin, den Datenbank-Prim?rschlüssel zu verwenden, um Duplikate zu entfernen. Geben Sie nach Abschluss des Gesch?fts die Prim?rschlüssel-ID ein ist der einzige Prim?rschlüssel der Gesch?ftstabelle, z. B. die Produkt-ID
Der Fingerabdruckcode dient zur Unterscheidung des Codes für jeden normalen Vorgang. Der Fingerabdruckcode wird für jeden Vorgang generiert. Es kann die Methode Zeitstempel + Gesch?ftsnummer verwendet werden.
Die obige SQL-Anweisung:
Wenn der Rückgabewert 0 ist, bedeutet dies, dass nach dem Gesch?ftsvorgang kein Vorgang durchgeführt wurde. Sie k?nnen ihn in t_check (eindeutige ID + Fingerabdruckcode) einfügen
Rückgabewert, wenn er gr??er als 0 ist. Nach der Operation direkt zurückkehren
Vorteile: Einfache Implementierung
Nachteile: Datenbankengpass bei hoher Parallelit?t
L?sung: Datenbanken und Tabellen nach ID für Algorithmus-Routing aufteilen
6.4, Redis-Atomoperation
Verwenden Sie die atomare Operation von Redis, um den Abschluss der Operation zu markieren. Diese Leistung ist besser. Aber es wird einige Probleme geben.
Erstens: Müssen wir die Gesch?ftsergebnisse in der Datenbank speichern? Wenn ja, besteht das Hauptproblem, das es zu l?sen gilt, darin, wie man Atomizit?t in Datenbank- und Redis-Operationen erreicht?
Das bedeutet, dass der Bestand um 1 reduziert wird, aber was soll ich tun, wenn der Redis-Vorgang nach Abschluss der Markierung fehlschl?gt? Das hei?t, wir müssen sicherstellen, dass die Datenbankl?schung und die Redis-Operation entweder erfolgreich sind oder fehlschlagen. Zweitens: Wenn die Datenbank nicht gel?scht wird, wird alles im Cache gespeichert. Wie wird die geplante Synchronisierungsstrategie festgelegt?
Dies bedeutet, dass der Bestand um 1 reduziert wird und der Redis-Vorgang nicht direkt ausgeführt wird, um die Markierung abzuschlie?en. Anschlie?end wird ein weiterer Synchronisierungsdienst verwendet, um den Bestand zu l?schen , und wie man die Synchronisationsstrategie festlegt
Das obige ist der detaillierte Inhalt von[Interview] Wie kann eine 100 % erfolgreiche Zustellung von Nachrichten sichergestellt werden? Wie kann die Nachrichten-Idempotenz sichergestellt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Die Auswahl eines Docker-Images für Node mag trivial erscheinen, aber die Gr??e und potenziellen Schwachstellen des Images k?nnen erhebliche Auswirkungen auf Ihren CI/CD-Prozess und Ihre Sicherheit haben. Wie w?hlen wir also das beste Node.js-Docker-Image aus?

Dom?nenübergreifend ist ein Szenario, das in der Entwicklung h?ufig vorkommt und auch ein h?ufig in Interviews diskutiertes Thema ist. Die Beherrschung g?ngiger dom?nenübergreifender L?sungen und der dahinter stehenden Prinzipien kann nicht nur unsere Entwicklungseffizienz verbessern, sondern auch in Vorstellungsgespr?chen bessere Leistungen erbringen.

Das JS-Singleton-Muster ist ein h?ufig verwendetes Entwurfsmuster, das sicherstellt, dass eine Klasse nur eine Instanz hat. Dieser Modus wird haupts?chlich zur Verwaltung globaler Variablen verwendet, um Namenskonflikte und wiederholtes Laden zu vermeiden. Au?erdem kann er die Speichernutzung reduzieren und die Wartbarkeit und Skalierbarkeit des Codes verbessern.

Das Go-Framework besteht aus einer Reihe von Komponenten, die die integrierten Bibliotheken von Go erweitern und vorgefertigte Funktionen bereitstellen (z. B. Webentwicklung und Datenbankoperationen). Zu den beliebten Go-Frameworks geh?ren Gin (Webentwicklung), GORM (Datenbankoperationen) und RESTful (API-Verwaltung). Middleware ist ein Interceptor-Muster in der HTTP-Anforderungsverarbeitungskette und wird verwendet, um Funktionen wie Authentifizierung oder Anforderungsprotokollierung hinzuzufügen, ohne den Handler zu ?ndern. Die Sitzungsverwaltung verwaltet den Sitzungsstatus durch die Speicherung von Benutzerdaten. Sie k?nnen gorilla/sessions zum Verwalten von Sitzungen verwenden.

Was ist JPA? Wie unterscheidet es sich von JDBC? JPA (JavaPersistence API) ist eine Standardschnittstelle für objektrelationales Mapping (ORM), die es Java-Entwicklern erm?glicht, vertraute Java-Objekte zum Betreiben von Datenbanken zu verwenden, ohne SQL-Abfragen direkt in die Datenbank schreiben zu müssen. JDBC (JavaDatabaseConnectivity) ist die Standard-API von Java für die Verbindung mit Datenbanken. Sie erfordert, dass Entwickler SQL-Anweisungen verwenden, um die Datenbank zu betreiben. JPA kapselt JDBC, bietet eine bequemere und übergeordnete API für die objektrelationale Zuordnung und vereinfacht Datenzugriffsvorg?nge. Was ist in JPA eine Entit?t? juristische Person

Wie bestimmt JavaScript den Datentyp? In diesem Artikel werden 8 M?glichkeiten zur Verwendung von JS zur Bestimmung des Datentyps vorgestellt, die die Arbeit und Interviews effektiv unterstützen k?nnen. Der Interviewer l?chelte leicht, nachdem er ihn gelesen hatte.

Das URL-Modul und das Querystring-Modul sind zwei sehr wichtige URL-Verarbeitungsmodule. Es wird h?ufig bei der Entwicklung von Knotenservern verwendet.

In diesem Artikel werden 100 h?ufig gestellte PHP-Interviewfragen (mit gemeinsamen Antworten) zusammengestellt und geteilt, um Ihnen dabei zu helfen, Grundkenntnisse zu erwerben und Ihren PHP-Wissensvorrat zu erweitern. Es hat einen gewissen Referenzwert. Freunde in Not k?nnen sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
