RabbitMQ抓包分析之我的代码没有问题

标签: Java  计算机网络基础

一、为什么要抓包?

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

原文链接:加载失败,请重新获取