詳解消息隊列AMQP和JMS的概念以及區別

概述

因為之前用的都是JMS,領導要求用rabbitMQ,所以也接觸了AMQP方面內容,下面對這兩個做個總結,也做下備忘!


JMS

通常而言提到JMS(Java MessageService)實際上是指JMS API。JMS是由Sun公司早期提出的消息標準,旨在為java應用提供統一的消息操作,包括create、send、receive

等。JMS已經成為Java Enterprise Edition的一部分。從使用角度看,JMS和JDBC擔任差不多的角色,用戶都是根據相應的接口可以和實現了JMS的服務進行通信,進行相關的操作。

詳解消息隊列AMQP和JMS的概念以及區別

JMS通常包含如下一些角色:

詳解消息隊列AMQP和JMS的概念以及區別

JMS提供了兩種消息模型,peer-2-peer(點對點)以及publish-subscribe(發佈訂閱)模型。當採用點對點模型時,消息將發送到一個隊列,該隊列的消息只能被一個消費者消費。而採用發佈訂閱模型時,消息可以被多個消費者消費。在發佈訂閱模型中,生產者和消費者完全獨立,不需要感知對方的存在。

消息如何從producer端達到consumer端由message-routing來決定。在JMS中,消息路由非常簡單,由producer和consumer鏈接到同一個queue(p2p)或者topic(pub/sub)來實現消息的路由。JMSconsumer同時支持message selector(消息選擇器),通過消息選擇器,consumer可以只消費那些通過了selector篩選的消息。在JMS兄中,消息路由機制的圖示如下:

詳解消息隊列AMQP和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和JMS的概念以及區別

在AMQP中,消息路由(messagerouting)和JMS存在一些差別,在AMQP中增加了Exchange和binding的角色。producer將消息發送給Exchange,binding決定Exchange的消息應該發送到那個queue,而consumer直接從queue中消費消息。queue和exchange的bind有consumer來決定。AMQP的routing scheme圖示過程如下:

詳解消息隊列AMQP和JMS的概念以及區別

目前AMQP逐漸成為消息隊列的一個標準協議,當前比較流行的rabbitmq、stormmq都使用了AMQP實現。


詳解消息隊列AMQP和JMS的概念以及區別

JMS和AMQP的各項對比

一張圖說明:

詳解消息隊列AMQP和JMS的概念以及區別


其實相比JMS,基於AMQP的RabbitMQ具有路由靈活,消息可靠等特點,當有路由策略多樣化,和消息可靠傳輸的需求時可考慮使用基於AMQP的產品。後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~

詳解消息隊列AMQP和JMS的概念以及區別


分享到:


相關文章: