RabbitMQ in Depth札记——AMQ协议
RPC传输
作为AMQP的实现,RabbitMQ使用RPC(remote procedure call)模式进行远程会话。而不同于一般的RPC会话——客户端发出指令,服务端响应,但服务端不会向客户端发出指令;在AMQP规范中,服务端与客户端皆会发出指令。
对于AMQP,客户端首先发送protocol header至服务端。不过其并不能被当作一条请求指令,RabbitMQ的第一条指令是响应该信息的Connection.Start指令。其后客户端通过Connection.StartOK回应此RPC请求。

为了建立客户端与服务端的AMQP连接(connection),需要一连串的三次同步RPC请求,才能开始(start),调整(tune),打开(open)一条连接。一旦此过程完成,RabbitMQ便为应用程序即将发出的请求作好准备了。
AMQP规范里定义了信道(channel)的概念用于通信。信道使用AMQP连接作为通信的媒介,而其本身有着隔离会话的功能。一个AMQP连接可以包含多个信道,允许客户端与服务端之间的多个会话同时发生,从技术上讲,这被称作复用,它对于处理多个任务的多线程或异步应用十分有用。
AMQP的PRC帧结构
当指令发送至RabbitMQ及由其发出时,所需的参数皆被封装为“帧”(frame)的数据结构——你可以将其想象成火车的运货车厢。AMQP的帧由五个部分组成:
- 帧的类型
- 信道编号
- 帧的大小
- 帧的载荷(payload)
- 结束字节标志(ASCII值206)

AMQP规范定义了五种帧类型:协议header帧,方法帧,内容header帧,body帧以及心跳帧。每一种帧类型都有其特定功能。
- 协议header帧仅在连接RabbitMQ时使用一次。
- 方法帧在发送至RabbitMQ或由其发送的请求或应答中使用。
- 内容header帧包含消息的大小与属性。
- body帧包含消息的内容。
- 心跳帧用于检查确认连接双方是否可用且工作正常。
当向RabbitMQ发送一条消息,方法帧,header帧与body帧会被用到。首先被发送的是方法帧,其携带指令及所需的参数。之后的内容header帧包含消息属性及body大小。AMQP会有最大帧大小的限制(默认为131KB),如果消息的body超过这个大小,内容会被分隔成多个body帧。这些帧始终以同样顺序发送:一个方法帧,内容header帧,和一或多个body帧。

如上图所示,当发送一条消息,方法帧内包含Basic.Publish指令,其后内容header帧包含着消息属性。这些属性被封装在AMQP规范的数据结构——Basic.Properties。最后消息的内容被整理成一定数量的body帧。
为了减小数据大小提高传输效率,方法帧与内容header帧内的数据都经过压缩。但body帧里的数据是未被压缩的,并且对于RabbitMQ而言这部分数据也是不会被检验的(相对于方法帧与内容header帧里的数据)。
AMQP协议的使用
在发送消息之前,至少需要完成三步配置,设置交换机(Exchange)及队列(Queue),并将二者绑定(Binding)。
交换机通过Exchange.Declare指令创建。一旦RabbitMQ完成创建,一个Exchange.DeclareOK的方法帧会被发送以作为响应。若是有任何缘由导致创建指令失败,RabbitMQ会关闭相应的信道。

队列由Queue.Declare指令创建。同样地,若创建失败,相应信道会被关闭。

当交换机与队列都完成创建后,通过Queue.Bind指令,可以绑定一个队列至一个交换机。

RabbitMQ接收一条消息时,会从方法帧开始检测。Basic.Publish方法帧会包含交换机名称,路由键值等关键信息。当RabbitMQ评估这些数据时,会尝试用交换机名称与所配置的交换机相匹配。当找到合适的交换机,它会再评估其中的绑定关系,通过路由键值以找到正确的队列。如果能找到符合条件的队列,RabbitMQ服务器会以先进先出(FIFO)的顺序对消息进行排列。加入队列的并非实际的消息数据,而是其引用。这样做可以大幅提升性能,尤其当消息需要发布到多个队列时。只有所有队列中所引用的消息皆被投递或移除,实际的消息数据才会被RabbitMQ从内存中移除。
在消费(consume)消息时,需要注意Basic.Consume指令中no_ack参数的设置。如果no_ack标置设为true时,RabbitMQ将会持续发送消息,除非消费侧发送Basic.Cancel指令或者消费侧断开连接;若设置为false时,消费侧必须在每次接收到消息时发送Basic.Ack请求。这种情形下,消费侧必须在Basic.Deliver方法帧中携带delivery tag参数。RabbitMQ使用这个投递标签与信道一并作为通信的唯一标识,以用于消息应答,拒绝及否定应答。
RabbitMQ in Depth札记——AMQ协议的更多相关文章
- RabbitMQ AMQP (高级消息队列协议)
目录 RabbitMQ AMQP (高级消息队列协议) Message Queue 简介 概念 基本组成 场景及作用 AMQP简介 模型架构 基础组件 AMQP-RabbitMQ 简介 模型 特性 参 ...
- RabbitMQ MQTT协议和AMQP协议
RabbitMQ MQTT协议和AMQP协议 1 序言... 1 1.1 RabbitMq结构... 1 1.2 RabbitMq消息接收... 4 1.3 Ex ...
- rabbitMQ的简单实例——amqp协议带数据回写机制
rabbitMQ是一种高性能的消息队列,支持或者说它实现了AMQP协议(advanced message queue protocol高级消息队列协议). 下面简单讲一讲一个小例子.我们首先要部署好r ...
- 消息中间件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP协议!
前言 本章学习,我们可以了解到以下知识点: 互联网大厂为什么选择RabbitMQ? RabbiMQ的高性能之道是如何做到的? 什么是AMQP高级协议? AMQP核心概念是什么? RabbitMQ整体架 ...
- RabbitMQ核心概念和AMQP协议(二)
RabbitMQ是什么? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议,在完全不同的应用之间共享数据,RabbirMQ是使用Erlang语言来编写的,并且RabbitMQ是基于A ...
- 我要吹爆这份阿里中间件技术内部的RM笔记,简直佩服到五体投地
消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟.高并发.高可用.高可靠的分布式消息中间件.该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集 ...
- Rabbimq必备基础之对高级消息队列协议AMQP分析及Rabbitmq本质介绍
MQ的一个产品... [消息队列] 1. MSMQ windows自带的一个服务... [petshop],message存放在文件系统中. 最原始的消息队列... [集群,消息确认,内存化,高可用, ...
- 浅谈对RabbitMQ的认识
一.什么是消息队列?什么时候使用它? 在传统的web架构中(此处特指Java SSM架构),用户在web中进行了某项需要和后台产生交互的操作后,一般都要开启一个session,从view层开始,由co ...
- RabbitMQ简介
AMQP简介 在了解RabbitMQ之前,首先要了解AMQP协议.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消 ...
随机推荐
- 【转发】centos 7开启FTP以及添加用户配置权限,只允许访问自身目录,不能跳转根目录
1.切换到root用户 2.查看是否安装vsftp,我这个是已经安装的. [root@localhost vsftpd]# rpm -qa |grep vsftpd vsftpd-3.0.2-11.e ...
- virtualbox centos安装增强工具和Centos与VirtualBox共享文件夹设置
VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 CentOS 之后,不能直接运行安装好 Virtual ...
- MySQL MySql连接数与线程池
连接数 1. 查看允许的最大并发连接数 SHOW VARIABLES LIKE 'max_connections'; 2. 修改最大连接数 方法1:临时生效 SET GLOBAL max_conn ...
- iBatis resultMap报错 nullValue完美解决
http://blog.csdn.net/liguohuaty/article/details/4038437
- Linux 下查看局域网内所有主机IP和MAC
linux环境下,执行namp对局域网扫描一遍,然后查看arp缓存表就可以知道局域内ip对应的mac.namp比较强大也可以直接扫描mac地址和端口,执行扫描之后就可以在/proc/net/arp查看 ...
- 微信小程序场景值
场景值 基础库 1.1.0 开始支持,低版本需做兼容处理 当前支持的场景值有: 场景值ID 说明 1001 发现栏小程序主入口 1005 顶部搜索框的搜索结果页 1006 发现栏小程序主入口搜索框的搜 ...
- Ubuntu18.04启用中文输入法
Ubuntu18.04发布了,但是搜狗输入法目前尚未支持. 而18.04自带的中文输入法选择sunpinyin为预设中文输入引擎,但是并没有将sunpinyin放入iso镜像中.详情参考https:/ ...
- c++对c的加强
1.register关键字的加强 register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度,这只是一种请求,编译器可以拒绝这种申请. ( ...
- 9patch图的尺寸尽量为偶数
美工做了一张.9的背景图,宽度110*80 像素,描点如下: 放到720p的智能电视上观看,总感觉怪怪的.仔细观看可以发现,前景图总是不能完全的覆盖掉背景图.总有那么一个像素的点多余出来,如图所示: ...
- LVS DR模式搭建 keepalived lvs
LVS DR模式搭建• 三台机器 • 分发器,也叫调度器(简写为dir)172.16.161.130 • rs1 172.16.161.131 • rs2 172.16.161.132 • vip 1 ...