2017-06-09 2 views
0

Ich veröffentliche viele Nachrichten in meiner Warteschlange in RabbitMQ, wenn Arbeiter ausgeschaltet ist. Dann starte ich meinen Worker und er nimmt alle Nachrichten aus der Warteschlange und er funktioniert gut, aber wenn ich meinen Worker-Prozess stoppe, bevor er endet, werden alle Nachrichten aus der Warteschlange gelöscht. Wenn ich zweitens den gleichen Arbeiter starte, hat er keine Nachrichten zu nehmen.RabbitMQ nehmen eine Nachricht aus der Warteschlange beim Start

$channel->queue_declare($action, false, false, false, false); 

$channel->basic_qos(null, 1, null); 
$channel->basic_consume($action, '', false, true, false, false, $callback); 

Wie kann ich auf meine Arbeiter tun nur eine Nachricht beim Start aus der Warteschlange nimmt und wenn Arbeiter stoppt und startet nimmt er aus der Warteschlange Nachrichten weitermachen, wo er aufhört?

Antwort

0

Wenn keine Nachrichten mehr zu empfangen sind, wurden die Nachrichten bereits bestätigt.

"Auto Bestätigungen" sollte deaktiviert sein, so dass eine Bestätigung explizit manuell zurückgesendet werden muss (dh nachdem alle Arbeit erledigt ist), um den Verzehr der Nachricht abzuschließen.

$no_ack = false; # If no_ack is true the server does NOT expect a 
       # basic.ack response and will dequeue the message immediately! 
$channel->basic_consume($action, '', false, $no_ack, false, false, $callback); 

Die PHP tutorial on the RabbitMQ site zeigt, wie innerhalb der Callback einen ack zu senden.

Solange der Arbeiter getötet wird vor der Ack wurde gesendet die Nachricht wird wieder zur Verfügung gestellt, wenn die Verbindung geschlossen ist - und kann von anderen Verbrauchern abgeholt werden. Siehe Message Acknowledgements.

Insbesondere wrt die no-ack Bit:

Wenn dieses Feld gesetzt ist (true) der Server erwartet keine Bestätigungen für Nachrichten. Das heißt, wenn eine Nachricht an den Client übermittelt wird, nimmt der Server an, dass die Zustellung erfolgreich sein wird, und entfernt sie sofort wieder. Diese Funktionalität kann die Leistung erhöhen, jedoch auf Kosten der Zuverlässigkeit. Nachrichten können verloren gehen, wenn ein Client stirbt, bevor sie an die Anwendung geliefert werden.

+0

Es sieht gut aus, aber ich weiß nicht, wie jetzt ich Informationen zurücksenden kann, dass die Nachricht vollständig verbraucht ist. –

+0

@BartekPieczonka Verwenden Sie die Methode 'bacic_ack' (entsprechend dem Befehl' basic.ack'). Die PHP-Bibliothek Dokumentation ist .. Mist, aber es ist das gleiche Prinzip unter den verschiedenen Kunden. Siehe https://www.rabbitmq.com/tutorials/tutorial-two-php.html und notieren Sie "$ msg-> delivery_info ['channel'] -> basic_ack ($ msg-> delivery_info ['delivery_tag']);' – user2864740

+0

Yeah jetzt funktioniert gut, vielen Dank! Du bist toll. –

Verwandte Themen