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,高级消息队列协议,是应用层协议的一个开放标准,为面向消 ...
随机推荐
- SCWS 中文分词_测试成功
地址: http://www.xunsearch.com/scws/index.php
- Mybatis3——使用学习(一)
目录 Mybatis Mybatis参考资源 Mybatis 使用 肯定TM要跑起来 XML映射配置文件 Mapper XML 文件 Mybatis Mybatis参考资源 Mybatis官网手册:h ...
- 【C语言】数组名传递给函数,数组的sizeof变为4的原因
C语言中,数组名作为参数传递给函数时,退化为指针,sizeof对指针操作结果应该是4.例子如下: #include<iostream> using namespace std; void ...
- R语言手册
在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data analysis and visualization which is built bas ...
- oracle 12c common user与local user
12c的多租户架构,引入CDB和PDB概念,使得用户也分为两种:common用户和local用户. 1.common用户就是数据库的用户,这个用户在root和每个已存在的或以后要创建的PDB都是相同的 ...
- mysqlcheck与myisamchk的区别
mysqlcheck和myisamchk都可以用来检测和修复表.(主要是MyISAM表)但是也有以下不同点:1.都可以检查.分析和修复myisam表.但是mysqlcheck也可以检查.分析innod ...
- Atitit 数据库view视图使用推荐规范与最佳实践与方法
Atitit 数据库view视图使用推荐规范与最佳实践与方法 1. 视图的优点:1 1.1. **提升可读性 定制用户数据,聚焦特定的数据1 1.2. 使用视图,可以简化数据操作. 1 ...
- [svc]tomcat配置文件详解-最简单的基于mvn的war包
tomcat安全管理规范 java&tomcat配置参考(多看看这位大牛的博客,写的很好) Tomcat系列之Java技术详解 http://blog.51cto.com/freeloda/1 ...
- RSA加密和解密工具类
import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; i ...
- Spring自动扫描无法扫描jar包中bean的解决方法(转)
转载自:http://www.jb51.net/article/116357.htm 在日常开发中往往会对公共的模块打包发布,然后调用公共包的内容.然而,最近对公司的公共模块进行整理发布后.sprin ...