Verbrauchen nicht anerkennen Nachrichten von RabbitMq
Habe ich ein einfaches erstellen Verleger und Verbraucher, die ein Abonnent in der Warteschlange mit basic.consume
.
Meine Verbraucher erkennt die Nachrichten, wenn der job läuft, ohne eine Ausnahme. Wann immer ich eine Ausnahme ich nicht der ack-Nachricht und die Rückkehr zu früh. Nur die anerkannten Meldungen verschwinden aus der Warteschlange, damit das richtig funktioniert.
Jetzt möchte ich die Verbraucher zu Holen, die scheiterte wieder Nachrichten, aber der einzige Weg, um reconsume diese Nachrichten ist durch einen Neustart der Verbraucher.
Wie muss ich diesen Ansatz?
Setup-code
$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName('my-exchange');
$exchange->setType('fanout');
$exchange->declare();
$queue = new AMQPQueue($channel);
$queue->setName('my-queue');
$queue->declare();
$queue->bind('my-exchange');
Consumer-code
$queue->consume(array($this, 'callback'));
public function callback(AMQPEnvelope $msg)
{
try {
//Do some business logic
} catch (Exception $ex) {
//Log exception
return;
}
return $queue->ack($msg->getDeliveryTag());
}
Hersteller code
$exchange->publish('message');
InformationsquelleAutor der Frage Bram Gerritsen | 2013-07-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Meldung wurde nicht anerkannt und die Anwendung fehlschlägt, wird es nachgeliefert und automatisch
redelivered
- Eigenschaft auf den Umschlag gesetzt werdentrue
(es sei denn, Sie konsumieren mitno-ack = true
flag).UPD:
Müssen Sie
nack
Nachricht mit durchgangsschein Flagge in deinem catch-blockVorsicht unendlich nacked Nachrichtenwährend eine Nachlieferung zählen nicht umgesetzt RabbitMQ und in der AMQP-Protokoll überhaupt.
Wenn Sie nicht zu verwirren wollen mit solchen Nachrichten und wollen einfach hinzufügen einiger Verspätung möchten Sie vielleicht fügen Sie einige
sleep()
oderusleep()
vornack
Methode aufrufen, aber es ist nicht eine gute Idee überhaupt.Gibt es mehrere Techniken zum Umgang mit Zyklus wieder problem:
1. Verlassen Sie sich auf Dead Letter-Austausch
2. Verwenden pro Nachricht oder pro Warteschlange TTL
Beispiele (beachten Sie, dass für die queue-ttl passieren wir nur die Nummer und Nachricht ttl - alles, was wird die numerische Zeichenfolge):
2.1 Pro Nachricht ttl:
2.2. Pro Warteschlange ttl:
3. Halten redelivers zählen oder Links redelivers Anzahl (aka hop-limit oder ttl im IP-stack) im message-body oder Header
Code:
Kann es einige andere Wege, um eine bessere Kontrolle Nachricht redelivers fließen.
Abschluss: es gibt keine Wunderwaffe ist. Sie haben zu entscheiden, welche Lösung Ihren Bedarf das beste oder etwas anderen, aber vergesst nicht es zu teilen hier 😉
InformationsquelleAutor der Antwort pinepain
Wenn Sie nicht möchten, neu zu starten, die Verbraucher sind, dann
basic.recover
AMQP-Befehl kann das sein, was Sie wollen. Nach AMQP-Protokoll:InformationsquelleAutor der Antwort mike