rabbitmq网络请求分析

倾然丶 夕夏残阳落幕 提交于 2020-02-18 21:32:05

amqp协议是用长连接,每次发送数据包,可以包含多个帧。每个帧包含帧类型、通道、长度,及每种类型所需要的特定数据。帧类型包括:方法、请求头、请求体等。

1、先做tcp三次握手

2、连接。client发送amqp协议版本,0.9.1,这个包有点特殊,不是正常的帧结构。

然后,server响应Connection.Start消息。client响应Connection.Start-Ok,包含用户名/密码信息,连接建立。这个过程中,会互相发送彼此的环境等数据。

server端发送数据:

capabilities F
    publisher_confirms t 1
    exchange_exchange_bindings t 1
    basic.nack t 1
    consumer_cancel_notify t 1
    connection.blocked t 1
    consumer_priorities t 1
    authentication_failure_close t 1
    per_consumer_qos t 1
    direct_reply_to t 1
cluster_name S rabbit@DESKTOP-I4HSGR5	
copyright S .Copyright (c) 2007-2019 Pivotal Software, Inc.informationS9Licensed under the MPL 1.1. Website: https://rabbitmq.com
platform S Erlang/OTP 22.2
product S RabbitMQ
version S 3.8.2

Mechanisms: PLAIN AMQPLAIN
Locales: en_US

client发送数据:

product S RabbitMQ	
copyright S .Copyright (c) 2007-2016 Pivotal Software, Inc.
capabilities F
    exchange_exchange_bindings t 1
    connection.blocked t 1
    authentication_failure_close t 1
    basic.nack t 1
    publisher_confirms t 1
    consumer_cancel_notify t 1
information S Licensed under the MPL. See http://www.rabbitmq.com/
version S 3.6.3
platform S Java

Mechanisms: PLAIN
username/password: xxx xxx
Locales: en_US

3、异常关闭连接。鉴权、检查队列(跟创建队列一样都是Queue.Declare,只是参数不一样)、指定延迟路由等失败,则server发送Connection.Close消息,并返回错误原因。

3、调频。server发送Connection.Tune,client响应Connection.Tune_Ok

这个阶段会同步通道最大长度(不确定),帧最大长度(不确定),心跳间隔(不确定,实际是30秒一次,server和client都会发)

4、连接vhost。client发送连接的vhost的请求Connection.Open。client响应连接结果Connection.Open_Ok。如果没有这个vhost,则通过Connection.Close返回错误信息。

5、建立通道。client发送连接通道请求Channel.Open,server响应连接结果Channel.Open_Ok。通道号从1开始累加。如果项目有多个通道连接,就会请求多次,channel是1、2、3、4、5等等。

6、声明路由。client发送Exchange.Declare消息,server响应Exchange.Declare_Ok。

7、声明队列。client发送声明队列请求Queue.Declare,server响应创建结果Queue.Declare_Ok。如果没有配置创建队列,就不会有声明队列的请求。

8、消费者Qos控制。似乎只对于接收消息的服务有效,且针对每个channel,client分别发送Qos消息Basic.Qos,server响应Basic.Qos_Ok。Prefetch-Count是指的在一个通道接收的同时处理消息的数量,可能不同channel,及同一channel的多个消息,消费者客户端的处理方式不一样吧,会不会是channel用多线程,同一channel多个消息用排队?

9、消费者的消费队列控制。client发送Basic.Consume消息,server响应Basic.Consume_Ok消息。

10、生产者发送消息。client发送列队消息,一次请求包含3个帧,分别是Basic.Publish方法帧,及请求头、请求体帧。没有响应数据包。

11、消费者接收消息。server发送列队消息,包含3个帧,分别是Basic.Deliver方法帧,及请求头、请求体帧。

处理成功后,client发送Basic.Ack响应包。Basic.Ack响应包中的Delivery-Tag对应Basic.Deliver中的Delivery-Tag,从1累加。处理失败,client发送Basic.Nack响应包。

12、发送心跳。仅返回tcp的ACK包,不返回mq消息包

13、结束连接。

关闭tcp连接,发送RST数据包

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!