AMQP 協議介紹

?RabbitMQ 是遵從AMQP 協議的, 換句話說, RabbitMQ 就是AMQP

協議的Erlang 的實現(當然RabbitMQ 還支持STOMP2 、MQTT3 等協議) 0 AMQP 的模型架構
和RabbitMQ 的模型架構是一樣的,生產者將消息發送給交換器,交換器和隊列綁定。當生產
者發送消息時所攜帶的RoutingKey 與綁定時的BindingKey 相匹配時,消息即被存入相應的隊
列之中。消費者可以訂閱相應的隊列來獲取消息。

RabbitMQ 中的交換器、交換器類型、隊列、綁定、路由鍵等都是遵循的AMQP 協議中相
應的概念。目前RabbitMQ 最新版本默認支持的是AMQP 0-9-1 。本書中如無特殊說明,都以
AQMP 0-9-1 為基準進行介紹。

STOMP. 即Simple (or Stre阻úng) Text Oriented Messaging Protocol. 簡單(流〕文本面向消息協議,它提供了一個可互操作的
連接格式,運行STOMP 客戶端與任意STOMP 消息代理C Broker ) 進行交互。STOMP 協議由于設計簡單, 易于開發客戶端,
因此在多種語言和平臺上得到廣泛的應用.
MQTT. 即Message Queuing Telemetry Transport. 消息隊列遙澳~傳輸,是ffiM 開發的一個即時通信協議,有可能成為物聯網
的重要組成部分.該協議支持所有平臺,幾乎可以把所有物聯網和外部連接起來,被用來當作傳感器和制動器的通信協議。

AMQP 協議本身包括三層:

  • Module Layer: 位于協議最高層,主要定義了一些供客戶端調用的命令,客戶端可以利

用這些命令實現自己的業務邏輯。例如,客戶端可以使用Queue . Declare 命令聲明

一個隊列或者使用Basic.Consume 訂閱消費一個隊列中的消息。

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

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

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


?AMQP生產者流轉過程

為了形象地說明AMQP 協議命令的流轉過程,這里截取代碼清單1-1 中的關鍵代碼,如代
碼清單2-2 所示。

代碼清單2-2 簡潔版生產者代碼

Connection connection = factory .n ewConnection() ; //創建連接
Channel channel = connection.createChannel() ; //創建信道
String message = "Hello World! ";
channel.basicPublish(EXCHANGE NAME , ROUTING KEY ,
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes());
//關閉資源
channel.close() ;
connection . close();

  

當客戶端與Broker 建立連接的時候,會調用factory .newC onnection 方法,這個方法
會進一步封裝成Protocol Header 0-9-1 的報文頭發送給Broker ,以此通知Broker 本次交互采用
的是AMQPO-9-1 協議,緊接著Broker 返回Connection.Start 來建立連接,在連接的過程

中涉及Connection.Start/.Start-OK 、Connection.Tune/.Tune-Ok , Connection.
Open/ .Open-Ok 這6 個命令的交互。
當客戶端調用connection .createChannel 方法準備開啟信道的時候,其包裝
Channel . Open 命令發送給Broker ,等待Channel.Open-Ok 命令。
當客戶端發送消息的時候,需要調用channel . basicPublish 方法,對應的AQMP 命
令為Basic.Publish ,注意這個命令和前面涉及的命令略有不同,這個命令還包含了Content
Header 和Content Body 0 Content Header 里面包含的是消息體的屬性,例如,投遞模式、優先級等,而Content Body 包含消息體本身。

當客戶端發送完消息需要關閉資源時,涉及Channel.Close/.Close-Ok 與
Connection.Close/.Close-Ok 的命令交互。詳細流轉過程如圖2-10 所示。

?

?

消費者的流轉過程, 參考代碼清單1-2 , 截取消費端的關鍵代碼如代碼清
單2-3 所示。
代碼清單2-3 簡潔版消費者代碼

Connection connection = factory.newConnection(addresses);// 創建連接
final Channel channel = connection . createChannel() ; //創建信道
Consumer consumer = new DefaultConsumer(channel) ()//_省略實現
channel . basicQos(64) ;
channel.basicConsume(QUEUE NAME , consumer) ;
//等待回調函數執行完畢之后,關閉資源
TimeUnit . SECONDS . sleep(5) ;
channel . close();
connection.close();

  

其詳細流轉過程如圖2-11 所示。

消費者客戶端同樣需要與Broker 建立連接,與生產者客戶端一樣,協議交互同樣涉及
Connection.Start/ . Start-Ok 、Connection.Tune/.Tune-Ok 和Connection.
Open/ . Open-Ok 等,圖2-11 中省略了這些步驟,可以參考圖2-10 。
緊接著也少不了在Connection 之上建立Channe l,和生產者客戶端一樣,協議涉及
Channel . Open/Open-Oko
如果在消費之前調用了channel . basicQos(int prefetchCount) 的方法來設置消費
者客戶端最大能"保持"的未確認的消息數,那么協議流轉會涉及Basic.Qos/.Qos-Ok 這
兩個AMQP 命令。
在真正消費之前,消費者客戶端需要向Broker 發送Basic.Consume 命令(即調用
channel.basicConsume 方法〉將Channel 置為接收模式,之后Broker 回執
Basic . Consume - Ok 以告訴消費者客戶端準備好消費消息。緊接著Broker 向消費者客戶端推
送(Push) 消息,即Basic.Deliver 命令,有意思的是這個和Basic.Publish 命令一樣會
攜帶Content Header 和Content Body 0
消費者接收到消息并正確消費之后,向Broker 發送確認,即Basic.Ack 命令。
在消費者停止消費的時候,主動關閉連接,這點和生產者一樣,涉及
Channel . Close/ . Close-Ok 手口Connection.Close/ . Close-Ok 。

AMQP 命令概覽

AMQP 0-9-1 協議中的命令遠遠不止上面所涉及的這些,為了讓讀者在遇到其他命令的時候
能夠迅速查閱相關信息,下面列舉了AMQP 0-9-1 協議主要的命令,包含名稱、是否包含內容
體(Content Body) 、對應客戶端中相應的方法及簡要描述等四個維度進行說明,具體如表2-1
所示。

?

?

?

轉載于:https://www.cnblogs.com/saryli/p/9735165.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451124.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關聯表多數據的批量insert (批量導入,測試19W條數據用時46秒)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、業務需求 :作多個批量導入 ,根據業務不同,每條數據導入前作各種驗證, 導入后提示驗證…

Java已死?九百萬程序員說不

Java沒死,事實上它擁有足夠的能量讓你的應用跑起來。那些對Java吹毛求疵人頻繁地聚焦在一些小眾問題上,總是和其他技術或者語言做些不公平的對比,這些語言并沒有像Java一樣得到廣泛應用及長遠的歷史。 現在的小孩都能學Java,它在…

Linux SSH遠程管理故障如何排查?

SSH遠程管理故障排查方案:1、檢測兩個機器是否暢通兩個機器之間是否暢通,查看物理鏈路是否有問題(網線網卡、IP是否正確)第1步:物理鏈路是否暢通,比喻為“高速公路是否暢通”ping 排查客戶端到服務端的線路問題,ping是…

CSS中position的absolute和relative用法

static: HTML元素的默認定位方式absolute: 將對象從文檔流中拖出,使用left,right,top,bottom等屬性進行絕對定位。而其層疊通過z-index屬性定義。絕對定位的元素的位置相對于最近的已定位父元素,如果元素沒有已定位的父…

Spring HttpMessageNotReadableException異常

(一)現象 我們在進行服務間的rpc調用時,可能會遇到org.springframework.http.converter.HttpMessageNotReadableException異常。 其具體報錯如下: {"timestamp": 1456043810789,"status": 400,"error…

解決 -- java 調用webservice 服務端收到參數為null

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 我的客戶端和服務端都寫的很簡單,只是調用服務的時候, 服務端得不到參數,后來發現只改一個地方就可…

fastJson性能測試

測試裝備: mac pro 6核12線程 測試代碼: (1)序列化對象: import lombok.Data;Data public class User {int id;String name;int age;String address; } (2)序列化邏輯: import…

避免流量高峰期CDN問題的10個方法

在視頻流媒體中,因平臺火爆而出現問題是件好事。至少,這比根本沒有觀眾要好。\\也許你正在使用世界級的CDN,但是,在大型賽事期間,當CDN的服務器和對等點流量變得飽和的時候,一些用戶還是無法享受到流暢的體…

Android應用進入爆發期 手機游戲仍是市場重心

近日,91無線發布了《91無線移動應用發展趨勢報告(Android版)》。報告顯示,2012年,無論Android移動應用用戶下載還是開發者研發均呈爆發態勢,手機游戲仍是市場重心所在。同時,Android移動應用下載…

MQTT Client軟件-MQTTBox

最近發現了一個連接mqtt broker的軟件:MQTTBox。GitHub地址:https://github.com/workswithweb/MQTTBox 官網網站的介紹為:使用MQTTBox增強你的物聯網流程 MQTT客戶端特性 支持TCP、TLS、Web Sockets和安全的Web Sockets連接MQTT服務器支持各種…

fastJson toJSONString注意點

fastJosn是阿里爸爸推出一款高性能序列化工具,號稱最快的json序列化工具。不過好像也就那樣,在量比較大的時候優勢才會明顯。單次序列化時間還是會達到幾十毫秒的級別。 Fastjson is a Java library that can be used to convert Java Objects into the…

WebService中文件傳輸

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 WebService處理傳遞普通的信息,還可以傳輸文件,下面介紹WebService是怎么完成文件傳輸的。 1、 首先編寫服務器端…

Django框架-Form組件

一、DjangoForm組件介紹 我們之前在html頁面中利用form表單向后端提交數據時,都會寫一些獲取用戶輸入的標簽并且用form標簽把它們包起來。 與此同時我們在好多場景下都需要對用戶的輸入做校驗,比如驗證用戶是否輸入,輸入的長度和格式等是否正…

中國經濟轉型知易行難

摘要:一個亞洲國家正在崛起,出口機器勢不可擋,財富快速增長,覺得美國已是過去,自己的時代已經到來。這是2012年的中國?沒錯———但也是上世紀80年代的日本。 美國《芝加哥論壇報》網站5月20日文章&#xf…

進程和線程的剖析

進程和線程的區別?什么時候用進程?什么時候用線程? 答:首先得知道什么是進程什么是線程? 我的理解是進程是指在系統中正在運行的一個應用程序;程序一旦運行就是進程,或者更專業化來說&#xff1…

解決 java.net.ConnectException: Connection refused: connect 異常

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、 我的情況很簡單: 只是因為我調用服務端接口方法包名沒有寫對,應該如下面代碼中這樣寫: call.…

主席樹的各類模板(區間第k大數【動,靜】,區間不同數的個數,區間=k的個數)...

取板粗 好東西來的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid2665 (POJ2104)http://poj.org/problem?id2104 (POJ2761)http://poj.org/problem?id2761 題意:求區間第K大&…

java類內部的變量

類內部的變量分為兩部分: 一.類的成員變量 在類內部,變量定義部分,定義的變量。 二.局部變量 在類內方法體中定義的變量和方法中涉及的變量。 成員變量和局部變量的區別: (1)成員變量在整個類中都有效…

騰訊搜搜退出PC搜索領域:百度搜狗迎來雙龍競爭

摘要:據北京商報報道,上周末,騰訊對公司組織架構進行了大規模調整。業內普遍認為,搜搜并入騰訊無線后,這個獨立搜索平臺將被合并,失去獨立性,也將令搜搜官網域名soso.com走向“沒落”。據北京商…

facade-pattern外觀模式

外觀模式: 外觀模式是面向對象編程中的重要設計模式。外觀類用來掩蓋復雜的內部邏輯,為用戶提供簡潔統一的服務接口。外觀類的主要功能如下: 1.通過提供簡明的對外API接口,來提高程序的可閱讀性和間接性。 2.提供通用的特定功能…