AMQP: Bestätigung und Vorabruf

7

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.

  1. 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.

  2. Prefetch-Zählung bedeutet nichts, wenn keine Bestätigung vorhanden ist. Korrekt?

  3. 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.

    
Serge 08.02.2014, 22:22
quelle

1 Antwort

25

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:

  • Warteschlange : N Nachrichten x 1kb
  • Vorabholen : prefetch size
  • Automatisches Backup : prefetch-size=5kb, prefetch-count=4

Der Workflow:

  • Der Broker sendet 4 Nachrichten (begrenzt durch off ) an den Client. 4 Nachrichten werden als nicht angekreuzt markiert und aus der Warteschlange verschoben (damit sie nicht an andere Clients geliefert werden).
  • Client ack 1 Nachricht.
  • Der Broker hat die Nachricht -1 unpacked (entfernen Sie diese Nachricht) und sendet eine weitere Nachricht an den Client (+1 un-aked, -1 aus der Warteschlange, während der Client bereits 3 un-acked Nachrichten hat).
  • Der Kunde bestätigt den Rest 3 Nachrichten + neu geliefert.
  • Broker hat -4 Nachrichten nicht bestätigt und sendet erneut 4 Nachrichten, +4 un-aked, -4 aus der Warteschlange.
  • Client ack 1 Nachricht und schlägt fehl.
  • Der Broker wird -1 nicht-acked und dann den Rest un-acked in die Warteschlange zurück verschieben, also -3 un-aked und +3 Warteschlange, damit sie wieder an diesen oder einen anderen Client geliefert werden können.

Prefetch mit großen Nachrichten:

Bedingungen:

  • Warteschlange : 1 Nachricht x 5 KB, N Nachrichten x 1 KB
  • Vorabholen : prefetch-count=4
  • Automatisches Backup : prefetch-size=5kb, prefetch-count=2

Der Workflow:

  • Der Broker sendet 1 Nachricht (begrenzt durch off ) an den Client, und diese Nachricht wird als un-aked markiert.
  • Client ack 1 Nachricht.
  • Der Broker hat -1 Nachrichten nicht bestätigt, sendet erneut 2 Nachrichten (begrenzt durch prefetch-size=5kb , beachten Sie, dass nur die erste Nachricht 5kb groß war, der Rest sind 1kb) und diese Nachrichten als un-acked markiert.
  • Client ack 1 Nachricht und schlägt fehl.
  • Der Broker wird die achte Nachricht aus der Nachrichtenwarteschlange verschieben und der Rest der nicht bestätigten Nachrichten wird wieder in die Warteschlange verschoben, der sie angehören, sodass sie möglicherweise erneut an diesen oder einen anderen Client gesendet werden.

Mit automatischer Bestätigung:

Bedingungen:

  • Warteschlange : N Nachrichten x 1kb
  • Vorabholen : prefetch-count=2
  • Automatisches Backup : prefetch-size=5kb, prefetch-count=10

Der Workflow:

  • Während sowohl 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.

    
pinepain 09.02.2014, 17:05
quelle

Tags und Links