赞
踩
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数据包
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。