一、爲什麼要抓包?
- 當你app無法正常訪問?當你堅信你的程序木有問題?當你開始懷疑人生?當你開始相信神學? 這時候就需要掌握如何定位一個bug。
二、什麼是AMQP
- AMQP(Advanced Message Queuing Protocol,高級消息隊列協議)是一個進程間傳遞異步消息的網絡協議,而RabbitMQ就是基於這種協議實現的一套框架
三、如何利用抓包工具抓包
這裏我們使用用強大的抓包工具wireshark ,如果同學們需要抓http或者https協議的包的話推薦使用 fiddler ,不囉嗦,下面開始進入主題。
- 運行消息生產者
- 打開抓包軟件開始抓包
- 運行消費者
消費者多開配置
spring:
application:
name: springboot-rabbitmq-consumer
rabbitmq:
host: xx.xx.xx.xx
port: 5672
username: admin
password: 123456
virtual-host: /
publisher-confirm-type: correlated #必須配置這個纔會確認回調
publisher-returns: true
listener:
type: simple
simple:
acknowledge-mode: manual #手動確認
prefetch: 1 #限制每次發送一條數據。
concurrency: 16 #同一個隊列啓動幾個消費者
max-concurrency: 16 #啓動消費者最大數量
#重試策略相關配置
retry:
enabled: true #是否支持重試
max-attempts: 5
stateless: false
#時間策略乘數因子
multiplier: 1.0
initial-interval: 1000ms
max-interval: 10000ms
default-requeue-rejected: true
-
下面是抓到的包
-
1-3幀 : TCP的建立連接的三次握手建立AMQP通信,這個跟建立http通信相似
-
4幀:RabbitMQ的客戶端告訴RabbitMQ自己使用的協議及版本
-
5幀:TCP應答信令:表示服務端告訴發送端已經收到這之前的包
-
6 - 14幀:RabbitMQ服務端和客戶端建立連接,並約定參數
-
6幀: Connection.Start:RabbitMQ告訴客戶端通信的協議和版本、SASL認證機制(詳細見)、語言環境以及RabbitMQ的版本信息和支持能力
-
7幀: Connection.Start-Ok :客戶端帶上連接使用的帳號和密碼、認證機制、語言環境、客戶的信息以及能力
-
8幀: Connection.Tune:RabbitMQ服務端和客戶端開始進行參數協商
-
9幀: Connection.Tune-Ok: 客戶端要麼接受服務端過來的參數,要麼將這些值變低,在發送給服務端
-
10幀: Connection.Open vhost=/ :RabbbitMQ客戶端打開一個連接,並請求設置vhost值
-
11幀 TCP應答
-
12幀 Connection.Open-Ok:RabbitMQ服務端對vhost進行驗證,如果成功,則返回如下此信息
-
13 - 14幀:創建通道
-
13幀: Channel.Open:客戶端打開一個新通道
-
14幀:Channel.Open-Ok:RabbitMQ服務端回覆新通道準備完畢
-
15-16幀: rabbitmq消息確認機制-confirm模式…百度另行補腦
-
17 - 18幀: 創建Exchange
-
17幀: Exchange.Declare 客戶端向RabbitMQ聲明一個Exchange
-
18幀: Exchange.Declare-Ok:RabbitMQ收到請求後,如果發現同名的exchange存在且屬性相同,則返回如下包,否則拋出異常
-
19-22幀: 消費端做開始接收消息之前的確認準備,這裏由於queue.helle隊列沒有數據,所以之後沒有消息數據傳輸
-
23-28幀:創建一條新的通道跟13-22幀一樣
-
29-31幀:跟19-22幀一樣
-
32-····幀:消息數據的傳輸······
看下我們可以數據幀裏面的數據
可以看到這就是我們的消息
消費者在消費的完數據的時候會發一個ack確認包給到RabbitMQ,RabbitMQ收到確認包後會刪掉髮給上一次消費者的消息,如果RabbitMQ一直收不到這個ack確認包,會重新把這條消息放到隊列裏面,讓消費端消費。
文獻參考:https://blog.csdn.net/hry2015/article/details/79273772