rabbitmq mehrere Verbraucher, die in einer Warteschlange - nur kriegt die Nachricht
Implementiert habe ich mehrere Verbraucher, die das abrufen von Nachrichten aus einer Warteschlange, ich mache das mit etwas ähnlich dieses Beispiel, außer, dass ich das Tue basic.Holen Sie sich in eine unendliche Schleife für die Abfrage an.
Irgendeine Idee, wie kann ich verhindern, dass Rennen zwischen allen Verbrauchern, d.h. nur eine Verbraucher die Nachricht erhalten und die anderen werden weiterhin zu tun, polling, bis eine andere Meldung kommt?
Ich habe versucht, Folgen einer Logik, in dem, sobald ich die Meldung bekomme ich ack es für die Nachricht entfernt werden, aber seine scheint, dass einige andere queues zu verwalten, zu erhalten, wird die Nachricht auch vor dem ersten ack hat und entfernt die Nachricht.
Also jeder bekam diese Meldung.
Vielen Dank im Voraus
- Wie sind Sie mit der Veröffentlichung der Nachricht in der Warteschlange? Wie werden Sie verbraucht? Verstehe ich richtig, dass alle Ihre Kunden die Nachricht erhalten, und nicht nur ein -, sondern Sie wollen nur ein client, um es zu empfangen? Oder muss nur ein client die Nachricht erhalten, und Sie wollen jeder, um es zu empfangen?
- Publishing über den Kanal.basic_publish -direkt mit routing_key konsumieren es mit basic_get, genau wie im Beispiel oben
- Alle meine Verbraucher die Nachricht erhalten , und ich möchte, dass die erste die es geschafft haben, verarbeiten es, und dass nur ein Verbraucher jede Nachricht aus der Warteschlange, der eine, der zur Verfügung steht
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie nicht, die Art und Weise Sie die Dinge eingerichtet. RabbitMQ wird round-robin, die Nachrichten an die Verbraucher, aber nur ein Verbraucher erhalten die Nachricht aus der Warteschlange. Dies ist durch design RabbitMQ, wenn Sie mehrere Verbraucher auf einer einzigen Warteschlange.
Wenn alle Verbraucher erhalten alle Nachrichten, dann müssen Sie die Konfiguration ändern, so dass jeder Verbraucher hat seine eigene Warteschlange. Dann müssen Sie veröffentlichen Sie Ihre Nachricht über einen exchange, wird die Zustellung der Nachricht an alle Warteschlangen, die für alle Verbraucher.
Der einfachste Weg, dies zu tun ist mit einem Fanout exchange geben.
channel.basiq_qos(prefetch_count=1)
und jetzt scheint es, dass nur ein Verbraucher die Nachricht bekommen und nicht alle von Ihnenprefetch_count
zu1
auf einen Kanal und mehrere Verbraucher auf diesem Kanal mitauto_ack
ausgeschaltet wird die Arbeit machen. Nur eine aktive Verbraucher halten Sie eine Nachricht, während andere warten. Beachten Sie, dass es nur funktioniert, wenn die Verbraucher auf den gleichen Kanal ein. Aber wenn Sie auf dem gleichen Kanal und müssen Sie verarbeiten die Nachricht nur von 1 Verbraucher zu einer Zeit, ich denke, es macht Sinn, führen nur einzelne Verbraucher. Werfen Sie auch einen Blick auf die Warteschlangeexclusive
parameter, in manchen Situationen kann es eine Lösung sein.