Der RabbitMQ Java-Client verfügt über die folgenden Konzepte:
Connection
- eine Verbindung zu einer RabbitMQ-ServerinstanzChannel
- ???- Consumer-Thread-Pool - Ein Pool von Threads, die Nachrichten aus den RabbitMQ-Serverwarteschlangen verbrauchen
- Warteschlange - eine Struktur, die Nachrichten in FIFO-Reihenfolge enthält
Ich versuche die Beziehung und vor allem die Assoziationen zwischen ihnen zu verstehen .
- Ich bin mir immer noch nicht ganz sicher, was ein
Channel
ist, abgesehen von der Tatsache, dass dies die Struktur ist, aus der Sie veröffentlichen und konsumieren, und dass sie aus einer offenen Verbindung erstellt wird. Wenn mir jemand erklären könnte, was der "Kanal" darstellt, könnte dies helfen, ein paar Dinge zu klären. - Wie ist die Beziehung zwischen Kanal und Warteschlange? Kann derselbe Kanal für die Kommunikation mit mehreren Warteschlangen verwendet werden oder muss er 1: 1 sein?
- Welche Beziehung besteht zwischen der Warteschlange und dem Verbraucherpool? Können mehrere Verbraucher dieselbe Warteschlange abonnieren? Können mehrere Warteschlangen von demselben Verbraucher verwendet werden? Oder ist die Beziehung 1: 1?
Vielen Dank im Voraus für jede Hilfe hier!
Antworten:
A
Connection
stellt eine echte TCP-Verbindung zum Nachrichtenbroker dar, während aChannel
eine virtuelle Verbindung (AMQP-Verbindung) darin ist. Auf diese Weise können Sie in Ihrer Anwendung so viele (virtuelle) Verbindungen verwenden, wie Sie möchten, ohne den Broker mit TCP-Verbindungen zu überlasten.Sie können eine
Channel
für alles verwenden. Wenn Sie jedoch mehrere Threads haben, wird empfohlen, einen anderen zu verwendenChannel
für jeden Thread zu verwenden.Sicherheit von Kanalthreads im Java Client API-Handbuch :
Es gibt keine direkte Beziehung zwischen
Channel
undQueue
. AChannel
wird verwendet, um AMQP-Befehle an den Broker zu senden. Dies kann die Erstellung einer Warteschlange oder ähnlichem sein, aber diese Konzepte sind nicht miteinander verbunden.Jeder
Consumer
in einem eigenen Thread ausgeführt, der aus dem Consumer-Thread-Pool zugewiesen wird. Wenn mehrere Verbraucher dieselbe Warteschlange abonniert haben, verwendet der Broker Round-Robin, um die Nachrichten gleichmäßig zwischen ihnen zu verteilen. Siehe Tutorial 2: "Arbeitswarteschlangen" .Es ist auch möglich, dasselbe
Consumer
an mehrere Warteschlangen anzuhängen . Sie können Verbraucher als Rückrufe verstehen. Diese werden jedes Mal aufgerufen, wenn eine Nachricht in einer Warteschlange eintrifft, an die der Verbraucher gebunden ist. Für den Fall des Java-Clients verfügt jeder Verbraucher über eine MethodehandleDelivery(...)
, die die Rückrufmethode darstellt. Was Sie normalerweise tun, ist UnterklasseDefaultConsumer
und ÜberschreibenhandleDelivery(...)
. Hinweis: Wenn Sie dieselbe Consumer-Instanz an mehrere Warteschlangen anhängen, wird diese Methode von verschiedenen Threads aufgerufen. Achten Sie also bei Bedarf auf die Synchronisation.quelle
Hier ist ein gutes konzeptionelles Verständnis der Funktionsweise des AMQP-Protokolls "unter der Haube" hilfreich. Ich würde anbieten, dass die Dokumentation und API, die AMQP 0.9.1 für die Bereitstellung ausgewählt hat, dies besonders verwirrend macht, sodass die Frage selbst eine ist, mit der sich viele Menschen auseinandersetzen müssen.
TL; DR
Eine Verbindung ist der physisch ausgehandelte TCP-Socket mit dem AMQP-Server. Bei ordnungsgemäß implementierten Clients ist eine dieser Anwendungen pro Anwendung threadsicher und kann unter Threads gemeinsam genutzt werden.
Ein Kanal ist eine einzelne Anwendungssitzung für die Verbindung. Ein Thread hat eine oder mehrere dieser Sitzungen. Die AMQP-Architektur 0.9.1 sieht vor, dass diese nicht von Threads gemeinsam genutzt werden dürfen und geschlossen / zerstört werden sollten, wenn der Thread, der sie erstellt hat, damit fertig ist. Sie werden auch vom Server geschlossen, wenn verschiedene Protokollverletzungen auftreten.
Ein Consumer ist ein virtuelles Konstrukt, das das Vorhandensein einer "Mailbox" auf einem bestimmten Kanal darstellt. Die Verwendung eines Verbrauchers weist den Broker an, Nachrichten von einer bestimmten Warteschlange an diesen Kanalendpunkt zu senden.
Verbindungsdaten
Erstens, wie andere richtig betont haben, a Verbindung das Objekt, das die tatsächliche TCP-Verbindung zum Server darstellt. Verbindungen werden in AMQP auf Protokollebene angegeben, und die gesamte Kommunikation mit dem Broker erfolgt über eine oder mehrere Verbindungen.
Kanal Fakten
Ein Kanal ist die Anwendungssitzung, die für jeden Teil Ihrer App geöffnet wird, um mit dem RabbitMQ-Broker zu kommunizieren. Es arbeitet über eine einzelne Verbindung und repräsentiert eine Sitzung mit dem Broker.
Verbraucher Fakten
Ein Verbraucher ist ein Objekt, das durch das AMQP-Protokoll definiert ist. Es ist weder ein Kanal noch eine Verbindung, sondern etwas, das Ihre spezielle Anwendung als eine Art "Postfach" zum Löschen von Nachrichten verwendet.
In Bezug auf das, was Sie unter Consumer-Thread-Pool verstehen, vermute ich, dass der Java-Client etwas Ähnliches tut, wie ich meinen Client programmiert habe (meiner basierte auf dem .Net-Client, wurde jedoch stark modifiziert).
quelle
Ich habe diesen Artikel gefunden, der alle Aspekte des AMQP-Modells erklärt, von denen Channel einer ist. Ich fand es sehr hilfreich, um mein Verständnis abzurunden
https://www.rabbitmq.com/tutorials/amqp-concepts.html
quelle
Es gibt eine Beziehung zwischen wie Eine TCP-Verbindung kann mehrere Kanäle haben .
Kanal : Es ist eine virtuelle Verbindung innerhalb einer Verbindung. Beim Veröffentlichen oder Konsumieren von Nachrichten aus einer Warteschlange erfolgt alles über einen Kanal. Verbindung : Es handelt sich um eine TCP-Verbindung zwischen Ihrer Anwendung und dem RabbitMQ-Broker.
In einer Multithreading-Architektur benötigen Sie möglicherweise eine separate Verbindung pro Thread. Dies kann zu einer unzureichenden Auslastung der TCP-Verbindung führen. Außerdem erhöht dies den Aufwand für das Betriebssystem, um so viele TCP-Verbindungen herzustellen, wie während der Spitzenzeit des Netzwerks erforderlich sind. Die Leistung des Systems könnte drastisch reduziert werden. Hier bietet sich der Kanal an, der virtuelle Verbindungen innerhalb einer TCP-Verbindung herstellt. Dies reduziert sofort den Overhead des Betriebssystems und ermöglicht es uns, asynchrone Vorgänge schneller, zuverlässiger und gleichzeitig auszuführen.
quelle