Zunächst einmal haben wir 100 unverarbeitete Nachrichten auf unserem rabbitmq-Server, wir öffnen zufällig einen Consumer-Client, und folgende Situation tritt auf:
100 Datenstücke, alle in einem Augenblick übertragen, aber wir können nicht so viele Daten gleichzeitig mit einem einzigen Kunden verarbeiten – was sollten wir tun?
Wie auf dem obigen Bild gezeigt, haben wir den Empfang der Nachricht nicht bestätigt! Wenn der Produzent es weiterhin versendet, werden wir Verbraucher es weiterhin erhalten!
Stellen Sie sich vor, wenn wir einzelne Verbraucher bis zu 60 Nachrichten in einer Minute verarbeiten können, ein Hersteller jedoch 300 Nachrichten in einer Minute senden kann, wenn,Wir haben einen Consumer-Client, der innerhalb einer Minute 300 Nachrichten gleichzeitig empfangen muss, was unsere maximale Last überschritten hat, was dazu führen kann, dass die Serverressourcen erschöpft sind und der Consumer-Client stecken bleibt。
RabbitMQ bietet eine qoS-Funktion (Quality of Service), das heißt, unter der Prämisse der nicht-automatischen Bestätigung von Nachrichten, wenn eine bestimmte Anzahl von Nachrichten (durch Festlegen des Qos-Werts basierend auf Konsum oder Kanal) nicht bestätigt wird, werden keine neuen Nachrichten konsumiert.
prefetchSize:0 prefetchCount: Sagt RabbitMQ, nicht mehr als N Nachrichten gleichzeitig an einen Konsumenten zu senden, d. h. sobald es N Nachrichten gibt, die noch nicht geackt haben, blockiert der Consumer, bis ein Nachrichten-Ack vorliegt global:true/false Ob die oben genannten Einstellungen auf Kanäle angewendet werden, einfach gesagt, ob die oben genannten Einschränkungen auf Kanalebene oder auf Verbraucherebene gelten
Hinweis: Es heißt, dass prefetchSize und global nicht von rabbitmq implementiert sind, daher werde ich sie vorerst nicht studieren
prefetch_count tritt in Kraft, wenn no_ask=falsch,Das heißt, im Fall der automatischen Antwort sind diese beiden WerteNicht wirksamvon
Setze prefetchCount = 3 mit der BasicQos-Methode. Dies ermöglicht es RabbitMQ, bis zu 3 Nachrichten pro Verbraucher gleichzeitig zu verarbeiten. Mit anderen Worten, es wird keine neuen Nachrichten an den Verbraucher weitergeben, bis er das Ack erhalten hat. So richtest du es ein:
Wie Sie in der Abbildung sehen können, hören zwei Konsumenten gleichzeitig Queue zu, aber beachten Sie, dass die Nachricht hier nur dann automatisch geaccked wird, wenn sie von einem Verbraucher konsumiert wird, und der andere Verbraucher diese Nachricht nicht erneut erhält.
Offizielle Website-Einführung: http://www.rabbitmq.com/consumer-prefetch.html
Beachten Sie, dass diese Methode dazu führen kann, dass die Warteschlange voll ist. Natürlich müssen Sie möglicherweise mehr Consumers hinzufügen oder mehr virtualHosts erstellen, um Ihr Design zu verfeinern.
|