1. 程式人生 > >AMQP & JMS對比(轉載)

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
版權宣告:本文為博主原創文章,轉載請附上博文連結!