RabbitMQ-AMQP協議

什麼是AMQP協議

爲了讓消息在各個消息隊列平臺之間互融互通,最開始是通過JMS,通過JMS視同通過Java API的方式隱藏MQ產品供應商提供的實際接口,解決互通問題。從技術上講java應用程序只需要針對JMS API編程選擇適合的MQ驅動即可,

JMS會打理好其他部分,ActiveMQ就是JMS的實現。不過嘗試使用單獨標準化接口來膠合衆多不同的接口最終會暴露出問題。使得應用程序變得更加脆弱。

2006年6月由於Cisco、Redhat、iMatix等聯合制定了AMQP的公開標準,它是應用層協議的一個開放標準。rabbit就基於AMQP的關鍵協議進行實現。

AMQP架構模型 生產者通過routing key投遞消息到exchage exchage根據routingKey與binding key映射 路由到投遞到具體隊列。

AMQP協議三層定義

AMQP協議本身包括三層。

Module Layer:位於協議最高層,主要定義了一些供客戶端調用的命令,客戶端可以利
用這些命令實現自己的業務邏輯。例如, 客戶端可以使用Queue.Declare命令聲明
一個隊列或者使用Basic.Consume訂閱消費一個隊列中的消息。

Session Layer:位於中間層, 主要負責將客戶端的命令發送給服務器, 再將服務端的應
答返回給客戶端,主要爲客戶端與服務器之間的通信提供可靠性同步機制和錯誤處理。


Transport Layer:位於最底層,主要傳輸二進制數據流,提供幀的處理、信道複用、錯
誤檢測和數據表示等。


AMQP說到底還是一個通信協議, 通信協議都會涉及報文交互, 從low-level舉例來說,
AMQP本身是應用層的協議, 其填充於TCP協議層的數據部分。而從high-level來說, AMQP
是通過協議命令進行交互的。AM QP協議可以看作一系列結構化命令的集合, 這裏的命令代表
一種操作, 類似於HTTP中的方法(GET、POST、PUT、DELETE等) 。

AMQP生產者交互過程

Connection connection= factory.new Connection() ; //創建連接
Channel channel =connection.create Channel() ; //創建信道
String message="HelloWorld!";
channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes(); 
//關閉資源
channel.close() ;
connection.close() ;

 

1.當調用factory.newConnection()

        這個方法會進一步分支成Protocol Header 0-9-1的報文發送給Broker 通知Broker本次交互採用的是AMQP 0-0-1協議

        Broker返回Conneciton.start來建立連接,在連接過程中涉及Connection.Start/.Start-OK、.Tune-Ok、Connection.Open/.Open-Ok命令

2.當調用connection.creatChannel方法開啓信道的時候

                       這個方法會發送Channel.Open命令發送給Broker 等待Channel.Open-Ok命令

3.當調用chanel.basicPubilish的時候

                       會對應發送AMQP命令Basic.Publish 包含了Header和ContentBody

                       ContentBody包含發送內容 Header包含消息體的屬性如投遞模式 優先級等

4.channel.close和 connection.close

 

                     對應AMQB Channel.Close Conneciton.Close

AQMP消費者消費交費過程

Connection connection=factory.new Connection(addresses) ; //創建連接
final Channel channel=connection.create Channel() ; //創建信道
Consumer consumer=new Default Consumer(channel){}//.....省略實現
channel.basic Qos(64) ;
channel.basic Consume(QUEUE_NAME, consumer) ;
//等待回調函數執行完畢之後,關閉資源
Time Unit.SECONDS.sleep(5) ;
channel.close() ;
connection.close() ;

1.首先跟生產者一樣 先與broker建立連接和再連接上創建channel

2.如果在消費之前調用了channel.basicQos方法設置消費最大保持未確認消息數量那麼協議會涉及Basic.Qos/.Qos-ok這2個AMQP命令

3.調用channel.basicConsumer會像Broker發送Basic.Consumer命令將Channel設置爲接收模式

4.之後Broker回執Basic.Consumer-Ok告訴消費者客戶端準備好消費消息

5.緊接着Broker向消費者客戶端推送消息即Basic.Deliver 攜帶ContentHeader和Content Body

5.消費者接受到消息並徵求消費後向Broker發送確認Basic.Ack命令

6.消費停止消息channel和連接和生產者一樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章