RabbitMQ抓包分析之我的代碼沒有問題

一、爲什麼要抓包?

  • 當你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

發佈了14 篇原創文章 · 獲贊 2 · 訪問量 8266
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章