JMS i AMQP - RabbitMQ

136

Próbuję zrozumieć, co JMS i jak jest połączony z terminologią AMQP. Wiem, że JMS to API, a AMQP to protokół.

Oto moje założenia (i pytania)

  • RabbitMQ używa protokołu AMQP (raczej implementuje protokół AMQP)
  • Klienci Java muszą używać bibliotek klienta protokołu AMQP, aby łączyć się / używać RabbitMQ
  • Gdzie tu chodzi o JMS API? Interfejs JMS API powinien używać bibliotek klienta AMQP do łączenia się z RabbitMQ?
  • Zwykle używamy JMS do łączenia się z brokerami wiadomości, takimi jak RabbitMQ, ActiveMQ itp. W takim razie jaki jest domyślny protokół używany tutaj zamiast AMQP?

Niektóre z powyższych mogą być głupie. :-) Ale próbuję objąć to głową.

Kevin Rave
źródło
3
@KevinRave: Wybrana odpowiedź jest błędna w niektórych głównych kwestiach. Dodałem komentarz, żebyś mógł się temu przyjrzeć.
2020
@KevinRave Edytowałem odpowiedź. Teraz Część kontrowersyjna została zastąpiona. Teraz cała odpowiedź jest całkowicie OK
Freak
Nie wiem, kto zredagował moją odpowiedź i podał ten niewłaściwy punkt, który był pod numerem 3 .. ponieważ już zapytałem o to, o czym mówi Kevin w punkcie 2. Zawsze czytaj uważnie przed głosowaniem lub przedstawieniem sugestii
Freak
1
Zapoznaj się z sekcją JMS w tym artykule. Ma bardzo szczegółowe wyjaśnienie saipraveenblog.wordpress.com/2014/12/08/…
java_geek
RabbitMQ
SyntaX

Odpowiedzi:

119

Twoje pytanie jest trochę nieuporządkowane i przypomina trudne pytanie w arkuszu z pytaniami :) (Ponieważ nauczyciele zawsze starają się zadawać proste, skomplikowane pytania: Mam nadzieję, że nie jesteś nauczycielem :)) Zobaczmy je wszystkie jeden po drugim.

Jak wiesz:

Interfejs API Java Message Service (JMS) to interfejs API Java Message Oriented Middleware (MOM) służący do wysyłania komunikatów między dwoma lub większą liczbą klientów . JMS jest częścią Java Platform, Enterprise Edition i jest zdefiniowany przez specyfikację opracowaną w ramach Java Community Process jako JSR 914. Jest to standard przesyłania wiadomości, który umożliwia tworzenie komponentów aplikacji opartych na Java Enterprise Edition (Java EE), wysyłać, odbierać i czytać wiadomości. Pozwala na luźne powiązanie, niezawodność i asynchroniczność komunikacji między różnymi komponentami aplikacji rozproszonej .

Teraz (z Wikipedii ):

Advanced Message Queuing Protocol (AMQP) to otwarty standard protokołu warstwy aplikacji dla oprogramowania pośredniczącego zorientowanego na komunikaty. Definiujące cechy AMQP to orientacja wiadomości, kolejkowanie, routing (w tym punkt-punkt oraz publikuj i subskrybuj), niezawodność i bezpieczeństwo.

I najważniejsze (znowu z Wikipedii):

W przeciwieństwie do JMS, który definiuje jedynie interfejs API, AMQP jest protokołem na poziomie łącza. Protokół na poziomie łącza to opis formatu danych, które są przesyłane w sieci jako strumień oktetów. W związku z tym każde narzędzie, które może tworzyć i interpretować komunikaty zgodne z tym formatem danych, może współpracować z każdym innym zgodnym narzędziem, niezależnie od języka implementacji.

Kilka ważnych rzeczy, które powinieneś wiedzieć:

  1. Należy pamiętać, że AMQP to technologia przesyłania wiadomości, która nie implementuje interfejsu API JMS.
  2. JMS to API, a AMQP to protokół, więc nie ma sensu mówić, że to, co jest domyślnym protokołem JMS, oczywiście aplikacje klienckie używają HTTP / S jako protokołu połączenia podczas wywoływania usługi WebLogic Web Service.
  3. JMS to tylko specyfikacja API. Nie używa żadnego protokołu. Dostawca JMS (taki jak ActiveMQ) może używać dowolnego bazowego protokołu do realizacji interfejsu API JMS. Na przykład: Apache ActiveMQ może korzystać z dowolnego z następujących protokołów: AMQP, MQTT, OpenWire, REST (HTTP), RSS i Atom, Stomp, WSIF, WS Notification, XMPP. Sugeruję przeczytanie Używanie JMS Transport jako protokołu połączenia .

Powodzenia :)

Wybryk
źródło
20
I am not sure but I believe that AMQP also uses HTTP/S protocol but AMQP is enhacement is messaging protocol over HTTP: Nie. To nie jest poprawne. JMS uses simple HTTP but for RabbitMQ/ActiveMq, they uses enhanced protocol.: Nie. To nie jest poprawne. JMS to tylko specyfikacja API. Nie używa żadnego protokołu. Dostawca JMS (taki jak ActiveMQ) może używać dowolnego bazowego protokołu do realizacji interfejsu API JMS. Na przykład: Apache ActiveMQ może korzystać z dowolnego z następujących protokołów: AMQP, MQTT, OpenWire, REST (HTTP), RSS i Atom, Stomp, WSIF, WS Notification, XMPP.
2020
Zredagowałem odpowiedź. Teraz Część kontrowersyjna została zastąpiona.
Freak
1
@brainOverflow Nie wiem, kto zredagował moją odpowiedź i podał ten niewłaściwy punkt, który znajdował się pod numerem 3 .. ponieważ zapytałem o to, o czym mówisz w punkcie 2. Zawsze uważnie przeczytaj przed głosowaniem lub przedstawieniem sugestii
Freak
Dodałem już rzeczy z tego pliku PDF, więc możesz przejść do innych linków
Freak
45

Zacznijmy od podstaw.

RabbitMQ to MOM (Message Oriented Middleware), opracowane w Erlang (język programowania zorientowany na TLC) i implementujące protokół przewodowy AMQP (Advance Message Queuing Protocol). Obecnie dostępnych jest wiele interfejsów API klienta (np. Java, C ++, RESTful itp.), Które umożliwiają korzystanie z usług przesyłania wiadomości RabbitMQ.

JMS (Java Messaging Service) to standard JCP definiujący zestaw strukturalnych interfejsów API do zaimplementowania przez MOM. Przykładem MOM, który implementuje (tj. Jest kompatybilny) API JMS, jest ActiveMQ; jest też HornetMQ i inne. Takie oprogramowanie pośredniczące pobiera interfejsy API JMS i odpowiednio implementuje wzorce wymiany.

Zgodnie z powyższym, biorąc pod uwagę szkielet interfejsów API JMS, instancję RabbitMQ i jego API klienta Java, możliwe jest opracowanie implementacji JMS z wykorzystaniem RabbitMQ: jedyną rzeczą, jaką należy teraz zrobić, jest zaimplementowanie wzorzec wymiany (przez RabbitMQ) zgodnie ze specyfikacją JMS.

Klucz jest taki: zestaw API, taki jak JMS, można zaimplementować niezależnie od technologii (w tym przypadku RabbitMQ).

Paolo Maresca
źródło
Co oznacza TLC?
mvmn
@mvmm TLC oznacza telekomunikację. Zapraszam do [1]. [1] allacronyms.com/TLC/Telecommunication
Paolo Maresca
15

JMS, gdy został zdefiniowany, nie definiował protokołu między klientem JMS a serwerem przesyłania wiadomości. Klient JMS, który implementuje interfejs API JMS, może używać dowolnego protokołu do komunikacji z serwerem przesyłania komunikatów. Klient musi tylko być zgodny z interfejsem API JMS. To wszystko. Zwykle klienci JMS używają niestandardowego protokołu zrozumiałego dla ich serwera przesyłania wiadomości.

Z drugiej strony AMQP jest protokołem między klientem obsługi wiadomości a serwerem obsługi wiadomości. Klient JMS może używać protokołu AMQP jako protokołu do komunikacji z serwerem obsługi komunikatów. A tacy klienci są dostępni.

http://www.lshift.net/blog/2009/03/16/openamqs-jms-client-with-rabbitmq-server

chitakasa
źródło
2
  • Gdzie tu chodzi o JMS API? Interfejs JMS API powinien używać bibliotek klienta AMQP do łączenia się z RabbitMQ?

JMS jest interfejsem API, więc niektóre interfejsy API JMS są implementowane za pośrednictwem protokołu AMQP (np. Apache QPID JMS ), podczas gdy większość interfejsów API JMS korzysta z innych protokołów. Jeśli wersja protokołu AMQP jest taka sama, taki klient powinien mieć możliwość komunikacji z innym klientem AMQP.

  • Zwykle używamy JMS do łączenia się z brokerami wiadomości, takimi jak RabbitMQ, ActiveMQ itp. W takim razie jaki jest domyślny protokół używany tutaj zamiast AMQP?

Zależy to od konfiguracji tego interfejsu API JMS. W przypadku ActiveMQ może to być AMQP, ale domyślnie jest to „openwire”

Axel Podehl
źródło
2

Chcę zasugerować artykuł, który bardzo mi pomógł w zrozumieniu różnicy między AMQP a JMS.

Oto link do artykułu: http://www.wmrichards.com/amqp.pdf

aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
źródło
W tym linku nie ma nic do bezpośredniego odczytania.
Bishwas Mishra
0

https://spring.io/understanding/AMQP

AMQP (Advanced Message Queuing Protocol) to jawnie opublikowana specyfikacja okablowania dla asynchronicznej obsługi wiadomości. Określany jest każdy bajt przesyłanych danych. Ta cecha umożliwia pisanie bibliotek w wielu językach i działanie w wielu systemach operacyjnych i architekturach procesorów, co stanowi prawdziwie interoperacyjny, wieloplatformowy standard przesyłania wiadomości.

AMQP jest często porównywany do JMS (Java Message Service), najpopularniejszego systemu przesyłania wiadomości w społeczności Java. Ograniczeniem JMS jest to, że określono interfejsy API, ale nie podano formatu komunikatu. W przeciwieństwie do AMQP, JMS nie ma wymagań dotyczących sposobu tworzenia i przesyłania komunikatów. Zasadniczo każdy broker JMS może implementować komunikaty w innym formacie. Muszą po prostu używać tego samego interfejsu API.

gstackoverflow
źródło
-1

Podejrzewam, że możesz szukać tej dokumentacji, która częściowo mówi:

Klient JMS dla vFabric RabbitMQ to biblioteka klienta dla vFabric RabbitMQ. vFabric RabbitMQ nie jest dostawcą JMS, ale ma funkcje potrzebne do obsługi modeli JMS Queue i Topic Messaging. Klient JMS dla RabbitMQ implementuje specyfikację JMS 1.1 jako dodatek do interfejsu API klienta Java RabbitMQ, umożliwiając tym samym nowym i istniejącym aplikacjom JMS łączenie się z brokerami RabbitMQ za pośrednictwem protokołu Advanced Message Queuing Protocol (AMQP).

Zagrożenie
źródło
Nie. To nie ten, na który patrzyłem. Ale podobnie.
Kevin Rave