AMQP & JMS對比(轉載)
AMQP & JMS對比
原文地址:https://blog.csdn.net/hpttlook/article/details/23391967
初次接觸訊息佇列時,在網上搜索,總是會提到如JMS、AMQP等一些術語。查看了一些文件,對JMS和AMQP的一些理解記錄如下。
JMS
通常而言提到JMS(Java MessageService)實際上是指JMS API。JMS是由Sun公司早期提出的訊息標準,旨在為java應用提供統一的訊息操作,包括create、send、receive
等。JMS已經成為Java Enterprise Edition的一部分。從使用角度看,JMS和JDBC擔任差不多的角色,使用者都是根據相應的介面可以和實現了JMS的服務進行通訊,進行相關的操作。
JMS通常包含如下一些角色:
Elements
Notes
JMS provider
實現了JMS介面的訊息中介軟體,如ActiveMQ
JMS client
生產或者消費訊息的應用
JMS producer/publisher
JMS訊息生產者
JMS consumer/subscriber
JMS訊息消費者
JMS message
訊息,在各個JMS client傳輸的物件;
JMS queue
Provider存放等待被消費的訊息的地方
JMS topic
一種提供多個訂閱者消費訊息的一種機制;在MQ中常常被提到,topic模式。
JMS提供了兩種訊息模型,peer-2-peer(點對點)以及publish-subscribe(釋出訂閱)模型。當採用點對點模型時,訊息將傳送到一個佇列,該佇列的訊息只能被一個消費者消費。而採用釋出訂閱模型時,訊息可以被多個消費者消費。在釋出訂閱模型中,生產者和消費者完全獨立,不需要感知對方的存在。
訊息如何從producer端達到consumer端由message-routing來決定。在JMS中,訊息路由非常簡單,由producer和consumer連結到同一個queue(p2p)或者topic(pub/sub)來實現訊息的路由。JMSconsumer同時支援message selector(訊息選擇器),通過訊息選擇器,consumer可以只消費那些通過了selector篩選的訊息。在JMS兄中,訊息路由機制的圖示如下:
常見的訊息佇列,大部分都實現了JMS API,可以擔任JMS provider的角色,如ActiveMQ,Redis以及RabbitMQ等。
AMQP
AMQP(advanced message queuing protocol)在2003年時被提出,最早用於解決金融領不同平臺之間的訊息傳遞互動問題。顧名思義,AMQP是一種協議,更準確的說是一種binary wire-level protocol(連結協議)。這是其和JMS的本質差別,AMQP不從API層進行限定,而是直接定義網路交換的資料格式。這使得實現了AMQP的provider天然性就是跨平臺的。意味著我們可以使用Java的AMQP provider,同時使用一個python的producer加一個rubby的consumer。從這一點看,AQMP可以用http來進行類比,不關心實現的語言,只要大家都按照相應的資料格式去傳送報文請求,不同語言的client均可以和不同語言的server連結。
在AMQP中,訊息路由(messagerouting)和JMS存在一些差別,在AMQP中增加了Exchange和binding的角色。producer將訊息傳送給Exchange,binding決定Exchange的訊息應該傳送到那個queue,而consumer直接從queue中消費訊息。queue和exchange的bind有consumer來決定。AMQP的routing scheme圖示過程如下:
目前AMQP逐漸成為訊息佇列的一個標準協議,當前比較流行的rabbitmq、stormmq都使用了AMQP實現。
最後將JMS和AMQP的各項對比如下:
JMS
AMQP
定義
Java api
Wire-protocol
跨語言
否
是
跨平臺
否
是
Model
提供兩種訊息模型:
(1)、Peer-2-Peer
(2)、Pub/sub
提供了五種訊息模型:
(1)、direct exchange
(2)、fanout exchange
(3)、topic change
(4)、headers exchange
(5)、system exchange
本質來講,後四種和JMS的pub/sub模型沒有太大差別,僅是在路由機制上做了更詳細的劃分;
支援訊息型別
多種訊息型別:
TextMessage
MapMessage
BytesMessage
StreamMessage
ObjectMessage
Message (只有訊息頭和屬性)
byte[]
當實際應用時,有複雜的訊息,可以將訊息序列化後傳送。
綜合評價
JMS 定義了JAVA API層面的標準;在java體系中,多個client均可以通過JMS進行互動,不需要應用修改程式碼,但是其對跨平臺的支援較差;
AMQP定義了wire-level層的協議標準;天然具有跨平臺、跨語言特性。
參考文件:
1、 http://en.wikipedia.org/wiki/AMQP
2、 http://en.wikipedia.org/wiki/Java_Message_Service
3、 http://www.bytespring.com/blog/understanding-differences-between-amqp-and-jms
---------------------
作者:hpttlook
來源:CSDN
原文:https://blog.csdn.net/hpttlook/article/details/23391967
版權宣告:本文為博主原創文章,轉載請附上博文連結!