Klient RabbitMQ Java ma następujące pojęcia:
Connection
- połączenie z instancją serwera RabbitMQChannel
- ???- Pula wątków konsumenta - pula wątków, które zużywają komunikaty z kolejek serwera RabbitMQ
- Kolejka - struktura przechowująca wiadomości w kolejności FIFO
Próbuję zrozumieć związek, a co ważniejsze , skojarzenia między nimi.
- Nadal nie jestem do końca pewien, czym
Channel
jest a , poza faktem, że jest to struktura, z której publikujesz i konsumujesz, i że jest ona tworzona z otwartego połączenia. Gdyby ktoś mógł mi wyjaśnić, co reprezentuje „kanał”, mogłoby to pomóc wyjaśnić kilka rzeczy. - Jaki jest związek między kanałem a kolejką? Czy ten sam kanał może być używany do komunikacji z wieloma kolejkami, czy też musi to być 1: 1?
- Jaka jest relacja między kolejką a pulą konsumentów? Czy wielu konsumentów może być subskrybowanych w tej samej kolejce? Czy ten sam konsument może korzystać z wielu kolejek? A może relacja 1: 1?
Z góry dziękuję za pomoc!
Odpowiedzi:
A
Connection
reprezentuje rzeczywiste połączenie TCP z brokerem komunikatów, podczas gdy aChannel
jest połączeniem wirtualnym (połączenie AMQP) w nim. W ten sposób możesz używać dowolnej liczby (wirtualnych) połączeń w aplikacji bez przeciążania brokera połączeniami TCP.Możesz użyć jednego
Channel
do wszystkiego. Jeśli jednak masz wiele wątków, sugeruje się użycie innegoChannel
dla każdego wątku.Bezpieczeństwo wątków kanału w przewodniku API klienta Java :
Nie ma bezpośredniego związku między
Channel
aQueue
. AChannel
służy do wysyłania poleceń AMQP do brokera. Może to być utworzenie kolejki lub coś podobnego, ale te pojęcia nie są ze sobą powiązane.Każdy
Consumer
działa we własnym wątku przydzielonym z puli wątków konsumenta. Jeśli wielu konsumentów subskrybuje tę samą kolejkę, broker używa okrężnego działania do równomiernego rozprowadzania komunikatów między nimi. Zobacz samouczek drugi: „Kolejki robocze” .Możliwe jest również dołączenie tego samego
Consumer
do wielu kolejek. Konsumentów można rozumieć jako wywołania zwrotne. Są one wywoływane za każdym razem, gdy wiadomość dociera do kolejki, z którą związany jest konsument. W przypadku klienta Java każdy Konsument ma metodęhandleDelivery(...)
, która reprezentuje metodę wywołania zwrotnego. Zwykle robisz podklasęDefaultConsumer
i przesłonięciehandleDelivery(...)
. Uwaga: jeśli dołączysz tę samą instancję konsumenta do wielu kolejek, ta metoda będzie wywoływana przez różne wątki. Zadbaj więc o synchronizację, jeśli to konieczne.źródło
W tym miejscu przydatne jest dobre koncepcyjne zrozumienie tego, co protokół AMQP robi „pod maską”. Chciałbym zaoferować, że dokumentacja i interfejs API, które AMQP 0.9.1 wybrał do wdrożenia, sprawiają, że jest to szczególnie mylące, więc samo pytanie jest tym, z którym wiele osób musi się zmagać.
TL; DR
Połączenie jest negocjowane fizyczne gniazdo TCP z serwerem AMQP. Prawidłowo zaimplementowani klienci będą mieli jeden z nich na aplikację, bezpieczny dla wątków, współdzielony między wątkami.
Kanał jest pojedyncza sesja aplikacja na połączenia. Wątek będzie miał jedną lub więcej takich sesji. Architektura AMQP 0.9.1 polega na tym, że nie mają one być współużytkowane między wątkami i powinny zostać zamknięte / zniszczone, gdy wątek, który go utworzył, zostanie zakończony. Są również zamykane przez serwer, gdy wystąpią różne naruszenia protokołu.
Konsument jest wirtualnym konstrukt oznacza obecność „skrzynki pocztowej” na danym kanale. Użycie konsumenta instruuje brokera, aby wypychał komunikaty z określonej kolejki do tego punktu końcowego kanału.
Fakty dotyczące połączeń
Po pierwsze, jak słusznie zauważyli inni, połączenie to obiekt reprezentujący rzeczywiste połączenie TCP z serwerem. Połączenia są określane na poziomie protokołu w AMQP, a cała komunikacja z brokerem odbywa się za pośrednictwem co najmniej jednego połączenia.
Informacje o kanale
Kanał jest sesja aplikacja, która jest otwarta dla każdego kawałka swojej aplikacji do komunikacji z brokerem RabbitMQ. Działa na jednym połączeniu i reprezentuje sesję z brokerem.
Fakty konsumenckie
Konsument to obiekt zdefiniowany przez protokół AMQP. Nie jest to kanał ani połączenie, a zamiast tego jest czymś, czego Twoja aplikacja używa jako swoistej „skrzynki pocztowej” do odrzucania wiadomości.
Jeśli chodzi o to, co rozumiesz przez konsumencką pulę wątków, podejrzewam, że klient Java robi coś podobnego do tego, co zaprogramowałem dla mojego klienta (mój był oparty na kliencie .Net, ale był mocno zmodyfikowany).
źródło
Znalazłem ten artykuł, który wyjaśnia wszystkie aspekty modelu AMQP, którego jednym jest kanał. Uważam, że jest to bardzo pomocne w pogłębianiu mojego zrozumienia
https://www.rabbitmq.com/tutorials/amqp-concepts.html
źródło
Istnieje relacja między jak połączenie TCP może mieć wiele kanałów .
Kanał : jest to wirtualne połączenie wewnątrz połączenia. Podczas publikowania lub konsumowania wiadomości z kolejki - wszystko odbywa się za pośrednictwem kanału, natomiast Połączenie : Jest to połączenie TCP między Twoją aplikacją a brokerem RabbitMQ.
W architekturze wielowątkowej może być potrzebne oddzielne połączenie na wątek. Może to prowadzić do niepełnego wykorzystania połączenia TCP, a także zwiększa obciążenie systemu operacyjnego, aby ustanowić tyle połączeń TCP, ile wymaga w czasie szczytu sieci. Wydajność systemu mogłaby zostać drastycznie zmniejszona. W tym miejscu przydaje się kanał, który tworzy wirtualne połączenia wewnątrz połączenia TCP. Od razu zmniejsza narzut systemu operacyjnego, a także pozwala nam wykonywać operacje asynchroniczne w szybszy, bardziej niezawodny i jednocześnie sposób.
źródło