訊息佇列之JMS和AMQP對比
JMS
JMS(Java MessageService)實際上是指JMS API,它定義了一些藉口,提供了一套標準API。
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
AMQP(advanced message queuing protocol)是一種協議,更準確的說是一種binary wire-level protocol(連結協議)。這是其和JMS的本質差別,AMQP不從API層進行限定,而是直接定義網路交換的資料格式。這使得實現了AMQP的provider天然性就是跨平臺的。意味著我們可以使用Java的AMQP provider,同時使用一個python的producer加一個rubby的consumer。只要都按照相應的資料格式去傳送報文請求,不同語言的client均可以和不同語言的server連線。
在AMQP中,訊息路由(messagerouting)和JMS存在一些差別,在AMQP中增加了Exchange和binding的角色。producer將訊息傳送給Exchange,binding決定Exchange的訊息應該傳送到那個queue,而consumer直接從queue中消費訊息。queue和exchange的bind有consumer來決定。AMQP的routing scheme圖示過程如下:
最後將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層的協議標準;天然具有跨平臺、跨語言特性。 |
相關文章
- 訊息佇列效能對比佇列
- AMQP訊息佇列的測試方法MQ佇列
- 乾貨分享 | 深度解析雲原生訊息佇列 AMQP佇列MQ
- RabbitMQ 訊息佇列之佇列模型MQ佇列模型
- MQ 訊息佇列 比較MQ佇列
- 訊息佇列的作用以及kafka和activemq的對比佇列KafkaMQ
- 訊息佇列之RabbitMQ佇列MQ
- 訊息佇列之RocketMQ佇列MQ
- 訊息佇列之 RabbitMQ佇列MQ
- 訊息佇列之 Kafka佇列Kafka
- 訊息佇列之 ActiveMQ佇列MQ
- 訊息佇列之 RocketMQ佇列MQ
- RabbitMQ,RocketMQ,Kafka 幾種訊息佇列的對比MQKafka佇列
- 訊息佇列之概論佇列
- 訊息佇列系列一:訊息佇列應用佇列
- 訊息佇列佇列
- RabbitMQ 訊息佇列之 Exchange TypesMQ佇列
- 溫故之訊息佇列ActiveMQ佇列MQ
- 訊息佇列之-RocketMQ入門佇列MQ
- 訊息佇列MQ應用場景及主流框架對比佇列MQ框架
- 訊息佇列(MQ)佇列MQ
- Kafka訊息佇列Kafka佇列
- RabbitMQ訊息佇列MQ佇列
- kafka 訊息佇列Kafka佇列
- POSIX訊息佇列佇列
- 訊息佇列(一)佇列
- 訊息佇列(二)佇列
- 訊息佇列二佇列
- [Redis]訊息佇列Redis佇列
- [訊息佇列]rocketMQ佇列MQ
- [訊息佇列]RabbitMQ佇列MQ
- 訊息佇列之如何保證訊息的可靠傳輸佇列
- 全面理解Handler-1:理解訊息佇列,手寫訊息佇列佇列
- [原始碼分析] 訊息佇列 Kombu 之 Hub原始碼佇列
- 訊息佇列的使用場景之kafka佇列Kafka
- 訊息佇列的使用場景之RabbitMQ佇列MQ
- MQ訊息佇列_RabbitMQMQ佇列
- Java面試—訊息佇列Java面試佇列