詳細介紹了JMS規范和AMQP協議的內容與區別,
文章目錄
- 1 JMS
- 1.1 JMS訊息模型
- 2 AMQP
- 2.1 AMQP訊息模型
- 3 對比
1 JMS
JMS(JAVA Message Service),即Java訊息服務,Java程式可以通過JMS服務進行異步的訊息傳輸,JMS API是一個Sun公司提出的訊息服務的標準或者說是規范,允許應用程式組件基于JavaEE平臺通過統一的介面創建、發送、接收和讀取訊息,這類似于JDBC規范,與具體的廠商實作無關,
ActiveMQ 就是基于 JMS 規范實作的,
1.1 JMS訊息模型
有兩種模型,這也幾乎是所有訊息佇列都有的模型:佇列模型和**發布****/**訂閱模型,RabbitMQ 采用佇列模型,RocketMQ和Kafka 采用發布/訂閱模型,
點到點(P2P)模型,發送者、接受者、訊息佇列,

使用佇列(Queue)作為訊息通信載體;滿足生產者與消費者模式,一個queue可以有很多消費者,但一條訊息只能被一個消費者使用,未被消費的訊息在佇列中保留直到被消費或超時,比如:我們生產者發送100條訊息的話,兩個消費者來消費一般情況下兩個消費者會按照訊息發送的順序各自消費一半(也就是你一個我一個的消費),
發布/訂閱(Pub/Sub)模型,發布者、訂閱者、主題,

發布訂閱模型(Pub/Sub) 使用主題(Topic)作為訊息通信載體,類似于廣播模式;發布者發布一條訊息,該訊息通過主題傳遞給所有的訂閱者,如果只有一個訂閱者,那它和佇列模型就基本是一樣的了,該模型在功能層面上是兼容佇列模型的,
2 AMQP
AMQP,即Advanced Message Queuing Protocol,一個提供統一訊息服務的應用層標準高級訊息佇列協議(二進制應用層協議),是應用層協議的一個開放標準,為面向訊息的中間件設計,兼容JMS,基于此協議的客戶端與訊息中間件可傳遞訊息,并不受客戶端/中間件同產品,不同的開發語言等條件的限制,
RabbitMQ 就是基于 AMQP 協議實作的,
2.1 AMQP訊息模型
AMQP在訊息的生產者以及傳遞資訊的佇列之間引入了一種間接的機制:Exchange,實作了生產者和佇列的解耦,

binding是exchange和queue之間的虛擬連接,binding中可以包含binding key,Binding資訊被保存到exchange中的查詢表中,用于message的分發依據,
message首先到達Exchange,隨后Exchange根據分發規則,匹配查詢表中的routing key,當滿足路由規則是,會將分發訊息到對應的queue中去,
AMQP提供四種不同型別的Exchange:
- Direct(point-2-point點對點模式):當Message中的routing key和Binding中的binding key完全一致,那么Exchange將message發到對應的queue中,
- Fanout(多播模式):每個發到Fanout型別Exchange的message都會分到所有系結的queue上去,
- Topic (發布-訂閱模式):當Message中的routing key和Binding中的binding key符合通配符匹配規則,那么Exchange將分發到目標queue中,
- headers:是使用訊息內容中的headers屬性(一個map的形式)來匹配,通過判斷headers中的鍵值對值能否匹配佇列和交換器系結時指定的鍵值對值來進行路由,
3 對比
| 對比方向 | JMS | AMQP |
|---|---|---|
| 定義 | Java API | 協議 |
| 跨語言 | 否 | 是 |
| 跨平臺 | 否 | 是 |
| 支持訊息型別 | 提供兩種訊息模型: Peer-2-Peer和Pub/Sub | 提供了五種訊息模型:direct exchange、fanout exchange、topic change、headers exchange、system exchange,本質來講,后四種和JMS的pub/sub模型沒有太大差別,僅是在路由機制上做了更詳細的劃分; |
| 支持訊息型別 | 支持多種訊息型別:StreamMessage(Java原始值的資料流)、MapMessage(一套名稱-值對)、TextMessage(一個字串物件)、ObjectMessage(一個序列化的 Java物件)、BytesMessage(一個位元組的資料流)、Message (只有訊息頭和屬性) | byte[ ](二進制) |
| 實作 | ActiveMQ | RabbitMQ |
AMQP 為訊息定義了線路層(wire-level protocol)的協議,而JMS所定義的是API規范,
在 Java 體系中,多個client均可以通過JMS使用統一的API進行互動,不需要應用修改代碼,但是其對跨平臺的支持較差,
而AMQP不從API層進行限定,而是直接定義網路交換的資料格式,無論生產者和消費者用什么語言撰寫,這樣訊息格式符合規則就能通信,這使得AMQP協議天然具有跨平臺、跨語言特性,
JMS 支持TextMessage、MapMessage 等復雜的訊息型別;而 AMQP 僅支持 byte[] 訊息型別(復雜的型別可序列化后發送),
由于Exchange提供的路由演算法,AMQP可以提供多樣化的路由方式來傳遞訊息到訊息佇列,而 JMS 僅支持佇列和主題/訂閱方式兩種,
如有需要交流,或者文章有誤,請直接留言,另外希望點贊、收藏、關注,我將不間斷更新各種Java學習博客!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333628.html
標籤:其他
上一篇:【ZooKeeper】Curator API介紹及基本使用
下一篇:資料倉庫技術選型
