Wenn der Konsument die Nachricht erhält und die Verarbeitungsaufgabe abgeschlossen ist, sendet er ein Ack mit dieser Nachrichtenkennung, um dem Server mitzuteilen, dass die Nachricht empfangen wurde und die Verarbeitung abgeschlossen ist. RabbitMQ wartet, bis die Verbindung des Consumers, der eine Nachricht verarbeitet, verloren gegangen ist, bevor es feststellt, dass die Nachricht nicht korrekt verarbeitet wurde, daher sendet RabbitMQ die Nachricht erneut. Die Nachrichtenbestätigung ist standardmäßig deaktiviert. Es gibt einen noAck-Parameter beim Initialisieren von Consumer,Wenn auf true gesetzt, gibt der Konsument sofort nach Empfang der Nachricht eine Ack zurück。
Im Allgemeinen wird das häufig verwendete Szenario Noack in der Regel als wahr gesetzt, aber für Projekte mit hohen Risikoanforderungen, wie z. B. Zahlung. Für jede Nachricht müssen wir ihre Integrität und Korrektheit sicherstellen. Nachdem Sie die Nachricht erhalten haben, müssen Sie bestätigen, dass die korrekte Geschäftslogik ausgeführt ist, und dann aktiv einen Ack an den Server zurückgeben. Sie können die Nachrichten in der Warteschlange über den rabbitmqctl-Befehl list_queues Namen message_rady message_unacknowleded oder über die Hintergrundverwaltungsoberfläche ansehen.
Wenn noAck auf false gesetzt ist, muss der Client aktiv einen Ack an den Server senden, und wenn der Client die Nachricht nicht bestätigt, tritt folgende Situation auf:
Solange das Programm noch läuft, bleiben diese 10 Nachrichten gelöscht und können von RabbitMQ nicht erneut zugestellt werden. Noch mächtiger ist, dassRabbitMQ-Nachrichtenkonsum hat keinen Timeout-Mechanismus, das heißt, wenn das Programm nicht neu gestartet wird, befindet sich die Nachricht immer im Zustand Unacked. Vergiss diese verdammten Zustandsmeldungen nicht, wenn du an Operationsereignissen arbeitest.
Bereit
Nachrichten mit diesem Status existieren in der zu verarbeitenden Warteschlange.
Nicht bestätigt
Eine Nachricht in diesem Status zeigt an, dass sie bereits verarbeitet wird, aber nicht bestätigt wird.
Wenn das Programm geschlossen wird (solange der Consumer geschlossen ist), kehren diese 10 Nachrichten in den Bereitschaftszustand zurück.
Bestätigungsnachricht
Was, wenn der Client einen Ack an den Server sendet? Das heißt, den Empfang der Nachricht bestätigen? Der Code lautet wie folgt:
Wenn der zweite Parameter der BasicAck-Methode, multiple, auf false gesetzt wird, bedeutet das, dass RabbitMQ benachrichtigt wird, dass die aktuelle Nachricht bestätigt wurde.Wenn zutreffend, wird eine zusätzliche Nachricht, die kleiner ist als das durch den ersten Parameter angegebene Liefertag, bestätigt。 (Massenbestätigung gilt für den gesamten Kanal)
Bestätigung abbrechen
Was ist, wenn einer der Clients des verteilten Programms eine Ausnahme hat und die Bestätigung der Nachricht abbrechen möchte und andere Clients die Nachricht verarbeiten lässt?
Wenn es eine Ausnahme in der Verbrauchsnachricht gibt, müssen wir die Bestätigung abbrechen, und dann können wir die basicReject-Methode von Channel verwenden.
Der erste Parameter spezifiziert das Liefertag, und der zweite Parameter beschreibt, wie diese Fehlermeldung behandelt wird.Ein Wert von true bedeutet, dass die Nachricht wieder in den Warteschlangenheader gelegt wird, und ein Wert von false bedeutet, dass die Nachricht aufgegeben wird。
|