Ich versuche einige Aspekte des AMQP-Protokolls zu verstehen. Zurzeit habe ich ein Projekt mit RabbitMQ und benutze Python Pika Library. Die Frage betrifft also die Bestätigung und das Vorablesen von Nachrichten.
Stellen Sie sich vor, wir haben eine Warteschlange mit nur Consumer (diese Warteschlange wurde natürlich als exklusiv deklariert). Also verstehe ich das richtig: egal ob ich mit oder ohne ack flagge konsumiere? Jedenfalls sollte ich nicht in der Lage sein, mehrere Nachrichten gleichzeitig zu verarbeiten, und es gibt keine weiteren Konsumenten, die einige andere noch in der Warteschlange befindliche Nachrichten übernehmen könnten. Es ist sogar besser, die Bestätigung nicht zu aktivieren, da dies möglicherweise die AMQP-Serverlast reduzieren kann.
Prefetch-Zählung bedeutet nichts, wenn keine Bestätigung vorhanden ist. Korrekt?
Ich bin mir nicht sicher, wie der Vorabruf funktioniert. Ich habe einen Rückruf auf eine neue Nachricht und in seiner finally Aussage bestätige oder lehne ich die Nachricht ab. Dies ist die einzige Funktion und unabhängig davon, wie groß der Prefetch-Zählwert sein würde - eine andere Nachricht würde sowieso nicht verarbeitet werden, bis die aktuelle abgeschlossen ist. Also, warum sollte ich prefetch_count Wert ändern?
Danke im Voraus.
Wenn% code_% flag unset gesetzt ist, gehen alle empfangenen Nachrichten verloren, wenn Ihre Anwendung während der Nachrichtenverarbeitung fehlgeschlagen ist. Wenn eine solche Situation sehr selten ist und die Nachricht verloren geht, ist eine geeignete Option in Ihrer Anwendung (zum Beispiel, aber nicht beschränkt auf, die Verarbeitung von Protokollen), können Sie die automatische Speicherung deaktivieren.
Und ja, da autoack
unset eine einfachere Broker-Logik erfordert, verbraucht es weniger Ressourcen.
Wie bei autoack
(und prefetch count
) teilen diese Optionen dem Broker mit, wie groß die Payload sein könnte, die im Voraus an die einzelne Nachricht gesendet wurde. Normalerweise wird es verwendet, um bei Netzwerkoperationen Zeit zu sparen, um auf neue Nachrichten zu warten. Wenn prefetch size
used client eine oder mehrere Nachrichten erhält, deren Gesamtgröße kleiner oder gleich der voreingestellten Prettch-Größe ist (und / oder count, was weniger ist).
Sowohl die prefetch size
als auch die prefetch count
Regeln werden angewendet. Wenn einer von ihnen auf Null gesetzt ist (nicht gesetzt), wird er nicht angewendet.
Das Wichtigste ist, dass prefetching das Verhalten zum Senden von Nachrichten vor mehr Nachrichten definiert, die der Client nicht gepackt hat .
In Verbindung mit diesen beiden Einstellungen ergibt sich Folgendes:
Vorababruf mit Nachrichtenlimit und Senden von Nachrichten im Voraus:
Bedingungen:
prefetch size
prefetch-size=5kb, prefetch-count=4
Der Workflow:
off
) an den Client. 4 Nachrichten werden als nicht angekreuzt markiert und aus der Warteschlange verschoben (damit sie nicht an andere Clients geliefert werden). Prefetch mit großen Nachrichten:
Bedingungen:
prefetch-count=4
prefetch-size=5kb, prefetch-count=2
Der Workflow:
off
) an den Client, und diese Nachricht wird als un-aked markiert. prefetch-size=5kb
, beachten Sie, dass nur die erste Nachricht 5kb groß war, der Rest sind 1kb) und diese Nachrichten als un-acked markiert. Mit automatischer Bestätigung:
Bedingungen:
prefetch-count=2
prefetch-size=5kb, prefetch-count=10
Der Workflow:
on
als auch prefetch-size
ignoriert werden, wenn prefetch-count
auf "true" gesetzt ist (so wird in RabbitMQ und in AMQP-Dokumenten automatisch-ack-Funktionalität aufgerufen), werden Nachrichten einzeln an den Client gesendet und entfernt aus der Warteschlange nach erfolgreichem Senden. Beachten Sie, dass AMQP eine asynchrone Architektur hat, sodass unter bestimmten Bedingungen zwei Clients gleichzeitig eine Nachricht empfangen können. Auch nicht bestätigte Nachrichten können an denselben Client zurückgesendet werden (insbesondere wenn Sie einen einzelnen Client haben).
Sehen Sie sich auch no-ack
an und prefetch-size
offizielle Dokumentation und experimentieren ein wenig mit diesen Optionen.
P.S .: prefetch-count
ist im Grunde autoack
AMQP-Flag auf no-ack
gesetzt.