2016-04-06 1 views
0

Angenommen, ich habe eine Warteschlange "Q1" und mehrere Hersteller veröffentlichen in dieser Warteschlange und mehrere Benutzer lesen aus dieser Warteschlange.Aufruf von publish in einem Übergabe-Handler. Rabbitmq

Jetzt verarbeitet jeder Verbraucher die Nachricht von 'Q1' und setzt sie wieder in eine andere Warteschlange, sagen wir 'Q2'/'Q3'.

Wie sollten die Kanäle damit verbunden sein? Ich habe einen einzelnen Produzenten-Kanal erstellt, der in jeder Warteschlange (Q1 und Q2/Q3) und mehreren Konsumenten-Kanälen veröffentlicht wird. Ist es in Ordnung, mit einem einzelnen Producer-Channel zu arbeiten oder gibt es Synchronisationsprobleme?

+0

Ist die Nachricht unverändert in seiner Existenz von Q1 zu Q2/Q3? Was meinst du mit "assoziierten Kanälen"? Und welche Art von Synchronisationsproblemen meinst du? Ein Produzent produziert Nachrichten so ... – cantSleepNow

+0

Nachricht wird geändert, wenn von Q1 nach Q2/Q3 geschoben wird. Mit 'assoziierten Kanälen' meine ich den Kanal, der zum Veröffentlichen oder zum Abrufen von Nachrichten verwendet wird. Es wird normalerweise vorgeschlagen, dass Anwendungen lieber einen Kanal pro Thread verwenden, anstatt denselben Kanal über mehrere Threads hinweg zu teilen. Aber wenn ich nur einen einzigen Producer-Kanal verwende, würde es dann Probleme geben? – user1200611

+0

Technisch nein, würde es nicht. Ich habe die C++ - Client-Lib verwendet, und dort gibt es ein einfaches Beispiel, in dem der Client eine Warteschlange abonniert, eine Nachricht sendet und sie dann empfängt, wobei alle denselben Kanal verwenden. https://github.com/alanxz/SimpleAmqpClient/blob/master/examples/simple_connect.cpp – cantSleepNow

Antwort

0

Im Allgemeinen ist es am besten, einen Kanal für den Thread zu haben.

Wenn Sie den gleichen Kanal mit mehreren Threads verwenden, sollten Sie den Zugriff synchronisieren, es gibt Client-Implementierung, die es für Sie tun.

Jetzt, wenn Sie einen einzigen Kanal verwenden, um mehr Warteschlangen zu veröffentlichen, ist in Ordnung, aber es sollte serialisiert werden.

Wenn Sie nach Leistung suchen, ist es besser, Multithreading-Publisher zu haben, bei denen jeder Thread seinen eigenen Kanal hat.

Die Kanal-Erstellung ist sehr "billig" in Bezug auf Ressource, also haben Sie keine Angst, mehr Kanäle zu verwenden.

Die Frage ist ein wenig generisch, ich hoffe, es hilft

+0

Mein Hauptanliegen ist, dass ich basicPublish-Methode von innerhalb handdelivery aufrufen würde, um die Nachrichten von Q1 nach Q2/Q3 zu verschieben. Angenommen, ich habe 20 Kunden an die Warteschlange Q1 angeschlossen und jeder Verbraucher hat seinen eigenen Kanal. Jetzt innerhalb des Verbrauchers würde ich basicPublish zu einem 'ProducerChannel' aufrufen, der von allen Verbrauchern geteilt wird. – user1200611

+0

Innerhalb der Lieferung können Sie ein 'publish' aufrufen, aber Sie sollten einen anderen Kanal verwenden. Ich fand diesen Beitrag https://dzone.com/articles/rabbitmq-amqp-channel-best, dass es sehr nützlich ist – Gabriele