Wie kann ich unbestätigte AMQP-Nachrichten von anderen als den eigenen Kanälen wiederherstellen?
Scheint es, desto länger behalte ich meine rabbitmq-server laufen, desto mehr Schwierigkeiten habe ich mit unbestätigten Nachrichten. Ich würde gerne requeue. In der Tat scheint es eine amqp-Befehl, um dies zu tun, aber es gilt nur für den Kanal, der die Verbindung mit. Ich baute ein kleines pika-Skript, um wenigstens zu versuchen es, aber ich bin entweder etwas fehlt oder es nicht auf diese Weise getan (wie etwa mit rabbitmqctl?)
import pika
credentials = pika.PlainCredentials('***', '***')
parameters = pika.ConnectionParameters(host='localhost',port=5672,\
credentials=credentials, virtual_host='***')
def handle_delivery(body):
"""Called when we receive a message from RabbitMQ"""
print body
def on_connected(connection):
"""Called when we are fully connected to RabbitMQ"""
connection.channel(on_channel_open)
def on_channel_open(new_channel):
"""Called when our channel has opened"""
global channel
channel = new_channel
channel.basic_recover(callback=handle_delivery,requeue=True)
try:
connection = pika.SelectConnection(parameters=parameters,\
on_open_callback=on_connected)
# Loop so we can communicate with RabbitMQ
connection.ioloop.start()
except KeyboardInterrupt:
# Gracefully close the connection
connection.close()
# Loop until we're fully closed, will stop on its own
connection.ioloop.start()
InformationsquelleAutor der Frage Will Olbrys | 2011-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unbestätigten Meldungen sind diejenigen, die geliefert wurden, über das Netzwerk an einen Verbraucher, aber noch nicht ack ' ed oder abgelehnt wurde-aber, dass der Verbraucher noch nicht geschlossen, der Kanal oder der Verbindung, über die es ursprünglich erhalten haben. Daher der broker kann nicht herausfinden, wenn der Verbraucher Sie einfach nur nehmen eine lange Zeit zum verarbeiten der Nachrichten, oder wenn es hat Sie ganz vergessen. Also, es lässt Sie in eine nicht akzeptierte Zustand, bis entweder der Verbraucher stirbt oder Sie bekommen ack freigegeben oder abgelehnt.
Da diese Nachrichten könnten noch gültig verarbeitet, die in der Zukunft durch die immer noch lebendig Verbraucher, dass ursprünglich Sie verzehrt, Sie können nicht (nach meinem wissen) fügen Sie einen weiteren Verbraucher in den mix und versuche, externe Entscheidungen über Sie. Müssen Sie fixieren Sie Ihre Verbraucher, um Entscheidungen über jede Nachricht, wie Sie verarbeitet anstatt die alten Nachrichten nicht bestätigt.
InformationsquelleAutor der Antwort Brian Kelly
Wenn Nachrichten unacked es gibt nur zwei Wege, um Sie zurück in die Warteschlange:
basic.nack
Dieser Befehl verursacht die Nachricht platziert werden zurück in die Warteschlange und nachgeliefert.
Trennen Sie vom broker
Diese Aktion zu zwingen, alle unacked Nachrichten aus diesem Kanal werden zurück in die Warteschlange gebracht.
HINWEIS: basic.erholen wird versuchen, erneut zu veröffentlichen unacked Nachrichten, die auf dem gleichen Kanal (der gleichen Verbraucher), der manchmal auch das gewünschte Verhalten.
RabbitMQ Skillung für basic.erholen und basic.nack
Die eigentliche Frage ist: Warum sind die Nachrichten, die nicht bestätigt?
Mögliche Szenarien:
Verbraucher Holen zu viele Meldungen, dann nicht Verarbeitung und durch ACK bestätigt, dass Sie schnell genug.
Lösung: Prefetch als paar Nachrichten als angemessen.
Buggy-client-Bibliothek (ich habe dieses Problem derzeit mit pika 0.9.13. Wenn die Warteschlange hat eine Menge von Nachrichten, die eine bestimmte Anzahl von Nachrichten stecken unacked, sogar Stunden später.
Lösung: ich habe neu zu starten, die Verbraucher mehrere Male, bis alle unacked Nachrichten, die verschwunden sind aus der Warteschlange.
InformationsquelleAutor der Antwort IvanD
Alle unbestätigten Meldungen gehen in den bereit-Zustand, wenn alle Arbeitnehmer/Verbraucher beendet werden.
Sicherzustellen, dass alle Beschäftigten sind angehalten, durch Bestätigung mit einer
grep
aufps aux
Ausgang, und stoppen/töten Sie Sie, wenn gefunden.Wenn Sie die Verwaltung der Arbeitnehmer mit Vorgesetzten, die zeigt, wie Arbeiter beendet ist, möchten Sie vielleicht zu prüfen, für die zombies. Betreuer berichten, dass die Arbeiter zu sein, stoppte aber immer noch finden Sie zombie-Prozesse ausgeführt, wenn grep auf ps aux Ausgang. Töten die zombie-Prozesse zu bringen-Nachrichten zurück in den bereit-Zustand.
InformationsquelleAutor der Antwort Venkat Kotra