RabbitMQ und Beziehung zwischen Kanal und Verbindung
Den RabbitMQ-Java-client hat die folgenden Konzepte:
Connection
- eine Verbindung zu einem RabbitMQ-server-InstanzChannel
- ???- Verbraucher-thread-pool - ein pool von threads, die das konsumieren von Nachrichten aus den RabbitMQ server-Warteschlangen
- Queue - Struktur, die enthält Nachrichten in FIFO-Reihenfolge
Ich versuche zu verstehen, die Beziehung, und noch wichtigerdie Verbände zwischen Ihnen.
- Bin ich mir noch nicht ganz sicher, was für eine
Channel
ist, außer der Tatsache, dass dies die Struktur, die Sie veröffentlichen und konsumieren aus, und es entsteht eine offene Verbindung. Wenn jemand könnte mir erklären, was der "Kanal" stellt, könnte es helfen, klar ein paar Dinge. - Was ist die Beziehung zwischen Kanal und die Warteschlange? Kann der gleiche Kanal verwendet werden, um die Kommunikation um ein Vielfaches Warteschlangen, oder muss es 1:1?
- Was ist die Beziehung zwischen Queue und der Verbraucher Pool? Können mehrere Verbraucher abonniert werden, um die gleiche Warteschlange? Können mehrere Queues konsumiert werden, die von den gleichen Verbraucher? Oder ist das Verhältnis 1:1?
Vielen Dank im Voraus für jede Hilfe hier!
InformationsquelleAutor der Frage | 2013-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
Connection
stellt eine echte TCP Verbindung zum message-broker, in der Erwägung, dass eineChannel
ist eine virtuelle Verbindung (AMPQ Verbindung) drin. Auf diese Weise können Sie so viele (virtuelle) verbindungen, wie Sie wollen, in Ihrer Anwendung ohne überlastung der broker mit TCP-verbindungen.Können Sie eine
Channel
für alles. Jedoch, wenn Sie mehrere threads, es ist vorgeschlagen, die Verwendung einer anderenChannel
für jeden thread.Kanal, thread-Sicherheit in der Java-Client-API-Handbuch:
Gibt es keine direkte Beziehung zwischen
Channel
undQueue
. EinChannel
senden AMQP-Befehle an den Makler. Dies kann die Erstellung einer Warteschlange oder ähnlichen, aber diese Konzepte sind nicht miteinander verbunden.Jeder
Consumer
läuft in einem eigenen thread zugeordnet, die in der consumer-thread-pool. Wenn mehrere Verbraucher abonniert sind, die gleiche Schlange, der broker verwendet round-robin-Verteilung der Nachrichten zwischen Ihnen ebenso. Sehen Tutorial zwei: "Work Queues".Ist es auch möglich, befestigen Sie die gleichen
Consumer
an mehrere Warteschlangen.Können Sie verstehen Verbraucher als callbacks. Diese sind aufgerufen, jedes mal wenn eine Nachricht in einer Warteschlange eintreffen der Verbraucher gebunden ist. Für den Fall, dass der Java-Client, jeder Verbraucher hat eine Methode
handleDelivery(...)
stellt für die callback-Methode. Was Sie normalerweise tun, ist, UnterklasseDefaultConsumer
und überschreibenhandleDelivery(...)
. Hinweis: Wenn Sie legen die gleichen Consumer-Instanz auf mehrere Warteschlangen haben, wird diese Methode aufgerufen werden, die von verschiedenen threads. So kümmern sich um die Synchronisation, wenn notwendig.InformationsquelleAutor der Antwort Bengt
Fand ich diesen Artikel, der erklärt alle Aspekte der AMQP-Modell, von welcher Kanal ist. Ich fand es sehr hilfreich, abgerundet wird mein Verständnis
https://www.rabbitmq.com/tutorials/amqp-concepts.html
InformationsquelleAutor der Antwort CamW
Ein gutes konzeptionelles Verständnis von dem, was das AMQP-Protokoll "unter der Haube" ist hier nützlich. Ich würde anbieten, dass die Dokumentation und API, die AMQP 0.9.1 wählte bereitstellen, macht diese besonders verwirrend, so dass die Frage selbst ist eine, die viele Menschen haben zu Ringen.
TL;DR
Einen Verbindung wird die körperliche ausgehandelt TCP-socket mit dem AMQP-server. Richtig umgesetzt, erhalten die Kunden eine dieser pro-Anwendung, thread-sichere, teilbare zwischen threads.
Einen Kanal ist eine einzelne Anwendung, die Sitzung auf die Verbindung. Ein thread wird eine oder mehrere dieser Sitzungen. AMQP-Architektur 0.9.1 ist, dass diese nicht geteilt werden zwischen threads, und sollte geschlossen werden/zerstört, wenn der thread, der erstellt wird, werden mit ihm fertig. Sie sind auch durch den server beendet wurde, wenn verschiedene Protokoll-Verletzungen auftreten.
Einen Verbraucher ist ein virtuelles Konstrukt, stellt die Anwesenheit von einem "Postfach" auf einem bestimmten Kanal. Die Nutzung durch einen Endverbraucher, erzählt der broker auf push-Nachrichten aus einer bestimmten Warteschlange, um das channel endpoint.
Verbindung Tatsachen
Erste, wie andere schon richtig hingewiesen, Verbindung ist das Objekt, das stellt die eigentliche TCP-Verbindung zum server. Verbindungen, angegeben sind auf der Protokoll-Ebene im AMQP, und alle Kommunikation mit dem broker erfolgt über einen oder mehrere Anschlüsse.
Kanal Tatsachen
Einen Kanal ist die Anwendung die Sitzung, die geöffnet wird, für jedes Stück Ihre app für die Kommunikation mit dem RabbitMQ-broker. Es arbeitet über eine einzelne Verbindungund stellt eine Sitzung mit dem broker.
Verbraucher-Fakten
Einen Verbraucher wird ein Objekt definiert durch das AMQP-Protokoll. Es ist weder ein Kanal noch eine Verbindung, anstatt etwas, das Sie für Ihre bestimmte Anwendung verwendet werden, als "mailbox" Art drop-Nachrichten.
In Bezug auf das, was du meinst, von Verbraucher-thread-pool, ich vermute, dass Java-client der etwas ähnliches macht, was ich programmiert habe, meinen Mandanten zu tun (mir wurde auf der Grundlage der .Net-client, aber stark modifiziert).
InformationsquelleAutor der Antwort theMayer