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的帧由五个部分组成:

  1. 帧的类型
  2. 信道编号
  3. 帧的大小
  4. 帧的载荷(payload)
  5. 结束字节标志(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协议的更多相关文章

  1. RabbitMQ AMQP (高级消息队列协议)

    目录 RabbitMQ AMQP (高级消息队列协议) Message Queue 简介 概念 基本组成 场景及作用 AMQP简介 模型架构 基础组件 AMQP-RabbitMQ 简介 模型 特性 参 ...

  2. RabbitMQ MQTT协议和AMQP协议

    RabbitMQ MQTT协议和AMQP协议 1        序言... 1 1.1     RabbitMq结构... 1 1.2     RabbitMq消息接收... 4 1.3     Ex ...

  3. rabbitMQ的简单实例——amqp协议带数据回写机制

    rabbitMQ是一种高性能的消息队列,支持或者说它实现了AMQP协议(advanced message queue protocol高级消息队列协议). 下面简单讲一讲一个小例子.我们首先要部署好r ...

  4. 消息中间件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP协议!

    前言 本章学习,我们可以了解到以下知识点: 互联网大厂为什么选择RabbitMQ? RabbiMQ的高性能之道是如何做到的? 什么是AMQP高级协议? AMQP核心概念是什么? RabbitMQ整体架 ...

  5. RabbitMQ核心概念和AMQP协议(二)

    RabbitMQ是什么? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议,在完全不同的应用之间共享数据,RabbirMQ是使用Erlang语言来编写的,并且RabbitMQ是基于A ...

  6. 我要吹爆这份阿里中间件技术内部的RM笔记,简直佩服到五体投地

    消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟.高并发.高可用.高可靠的分布式消息中间件.该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集 ...

  7. Rabbimq必备基础之对高级消息队列协议AMQP分析及Rabbitmq本质介绍

    MQ的一个产品... [消息队列] 1. MSMQ windows自带的一个服务... [petshop],message存放在文件系统中. 最原始的消息队列... [集群,消息确认,内存化,高可用, ...

  8. 浅谈对RabbitMQ的认识

    一.什么是消息队列?什么时候使用它? 在传统的web架构中(此处特指Java SSM架构),用户在web中进行了某项需要和后台产生交互的操作后,一般都要开启一个session,从view层开始,由co ...

  9. RabbitMQ简介

    AMQP简介 在了解RabbitMQ之前,首先要了解AMQP协议.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消 ...

随机推荐

  1. SoapUI Pro Project Solution Collection –Easy develop Groovy Script to improve SoapUI ability

    As you know the groovy script and java script language is the soapui supported .but unfortunately So ...

  2. fiddler展示serverIP方法

    转载自:http://www.xuanfengge.com/fiddler-displays-the-set-ip-method.html 前言 由于web前端在多个环境中开发,需要经常更换host, ...

  3. Redis server went away的解决方案

    Redis server went away出现的问题如下: 1.看redis服务是否启动,包括端口 2.看是否是服务器端的防火墙引起的,iptables和selinux 3.看是否是redis.co ...

  4. 创建一个可拖动的DIV

    var drag = function(){ var obj = document.getElementById("id"); var s = obj.style; var b = ...

  5. spring-mybatis-data-common程序级分表操作实例

    spring-mybatis-data-common-2.0新增分表机制,在1.0基础上做了部分调整. 基于机架展示分库应用数据库分表实力创建 create table tb_example_1( i ...

  6. 11G新特性 -- 块介质恢复性能增强(block media recovery)

    块介质恢复性能增强(block media recovery) :只是恢复受损的块.不需要将受损的数据文件offline.针对受损的数据块,使用备份中好的数据块进行restore和recover,避免 ...

  7. 【Big Data - Hadoop - MapReduce】通过腾讯shuffle部署对shuffle过程进行详解

    摘要: 通过腾讯shuffle部署对shuffle过程进行详解 摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,TDW计算引擎包括两部分:MapReduce和Spark,两者内部都 ...

  8. TEST DESIGN TECHNIQUES: AN OVERVIEW

    TEST DESIGN TECHNIQUES: AN OVERVIEW -Test note of “Essential Software Test Design” 2015-11-16 目录: 7. ...

  9. wamp多站点多端口配置

    1.配置httpd.conf 监听多个端口 #Listen 12.34.56.78:80 Listen 8081 Listen 8082 Listen 8083 可以通过netstat -n -a查看 ...

  10. 解决 meld 出现 locale.setlocale(locale.LC_ALL,'') 失败的问题

    . . . . . meld 是一款免费的文件比较工具,官网地址:http://meldmerge.org/ 在 Linux 环境使用 meld 的时候,可能会由于语言区域的配置问题导致它无法启动,会 ...