AMQP协议
2022-11-07 11:31:34 0 举报
AI智能生成
AMQP协议,分功能层、传输层介绍
作者其他创作
大纲/内容
功能层
消息的生命周期
消息由属性和消息内容组成,生产者发送消息时可以指定消息属性和内容,可以指定消息发往哪个交换机以及路由规则
当消息到达交换机时,交换机会根据路由规则投递到一个或多个消息队列,如果没有符合路由规则的队列,消息会丢失或退回生产者,
服务器通过复制消息或使用计数器将消息保存到不同队列中,每个队列的消息时相同的,操作是隔离的
消息到达队列后,会根据AMQP协议投递给消费者,如果暂时无法投递,消息会暂存在服务器中直到被消费
消息被消费后,消息从服务器中删除,可以等到消费者返回确认信息再删除,也可以直接删除,删除策略由消费者设定
virtual host
是一个逻辑分组,包含了exchange ,message queue
每个连接必须指定一个virtual host,客户端无法创建和配置vhost
channel
AMQP是一个多通道的协议,把一个重量级的TCP连接分成多个轻量级的连接,
因为端口号固定,是防火墙友好的,便于流控
不同的通道通信时,完全独立,但共享同一可用带宽
通过channelid来区分
生命周期:Channel.Open,Channel.Open-Ok,Channel.Close,Channel.Close-Ok
message queue
用来在内存或磁盘中存储消息,并且按顺序发给一个或多个消费者,可以是共享或私有的,临时或持久的,发送方命名或接收端声明的
共享持久化队列:对应多个消费者,按照轮询的方式将消息发给消费者
持久的:broker重启,队列不会删除
auto-delete:最后一个消费者断开连接后,队列自动删除
exclusive:排他队列,只对创建它的连接可见,其他连接访问(declare,publish,consume)返回405,连接断开后自动删除,即使它是持久化的,用于一个客户端同时发送和消费的场景
exchange
接收生产者发来的消息,并根据路由key将消息路由给队列或其他交换机,不会存储消息
只负责转发消息,不存储消息,如果没有队列与之绑定,或没有符合路由规则的队列,消息会丢失或退回
生命周期:Declare,delete
属性:名称、类型(direct,fanout,topic)、durable(服务端重启还能保留)、autodelete(有队列和交换机与之绑定,然后都解除绑定时,是否自动删除)、internal(内部交换机只能绑定其它交换机,客户端不能直接发送消息)
交换机类型
direct
处理路由键,队列和直连交换机绑定时需要指定路由key
消息的路由key必须和绑定的路由key完全匹配,消息才会路由到相应队列
fanout
不处理路由键,队列绑定时不需要指定路由key
消息会被路由到与交换机绑定的所有队列
topic
处理路由键,队列与交换机绑定时指定的路由key是带#或*通配符的,*匹配一个单词,#匹配一个或多个单词,单词以.分割
header
不处理路由键,而是根据消息的headers属性来匹配,在交换机与队列绑定的时候指定一组或多组键值对,当消息发送到headers交换机时,rabbitmq会读取消息的headers属性,与绑定队列的属性进行匹配,只有匹配上的才会发往该队列
路由键只能是一个字符串值,headers可以是多个值,值可以基本类型,字符串,集合等类型
绑定时,可以在headers属性中指定x-match=all,表示消息属性必须和绑定的属性完全匹配,x-match=any,只需一个匹配
对某个key,绑定没有,消息有,算匹配,绑定有,消息有且值相同,算匹配
basic
Qos
basic.qos是针对channel设置的
prefetchCount:消费端未确认消息的最大数目,如果超过这个数没有Ack,服务端将不再推送消息过来。可以在消费端进行流控,设定消费端一次能消费消息的最大数量
prefetchSize:最大未确认消息的字节数,如果超过这个数没有Ack,服务端将不再推送消息过来
global: true表示限制整个channel,否则限制单个消费者
consume
autoAck:是否自动确认消息,为true的话,不需要客户端确认消息是否签收,为false的话,需要客户端显示调用ack
publish
mandatory:
传输层
AMQP是一个基于面向流的可靠传输协议(TCP),按照不同类型的帧来传输,帧包含了帧头,帧体(payload),帧尾,帧体的格式取决于帧的类型
将单个socket连接分成多个channel,以便多个线程分别处理这些channel,每个帧会带一个channel id, 对于单个通道来说,帧是有序的
通过在帧头设定帧的大小来分割帧(防止粘包、半包)
数据类型
Integer: 1~8个字节,都是无符号的
Bit: 1个二进制位,用来表示开关
Short string:短字符串类型,255字节,由一个字节的无符号整型+变长字符串内容组成,前面是字节数
Long string:长字符串类型,用来存储二进制数据,由4个字节+变长字符串内容组成
timestamp:64位时间戳类型
Field tables:键值对类型,键是short string,值可以是Integer,string,Bit等, 键+值类型+值
帧头包含了1个字节帧类型,2个字节channel id,4个字节帧体大小
帧的类型
方法帧
包括class id,method id, 方法参数(键值对类型)
内容帧
有些方法(publish,delivery)会带内容,比如basic.publish,会发送消息体,消息体用内容帧发送,也就是说AMQP的方法不一定用一个帧发送,可能会是方法帧+内容帧
一些属性+二进制数据
内容帧=1个content header frame+1个或多个content body frame
心跳帧
用来向接收方表明发送方还活着,任何其他帧都可以代替心跳帧,只有再一个心跳间隔期间,没有发送任何帧数据才会发心跳
channel id为0表示该帧是属于整个连接的,比如心跳帧和部分方法帧,1~65535为真正的channel id,比如内容帧
返回码
403:权限错误
405:资源被锁定,比如创建一个其他连接已经创建的排他队列
406:方法参数有误,不应该为空的参数赋空或参数值前后不一致
503:AMQP协议版本不支持或exchange类型不支持
0 条评论
下一页