2019独角兽企业重金招聘Python工程师标准>>>

常用queue属性

在 rabbitmq-c代码中可以看到如下代码

上图所示为queue声明时使用的结构体。其中最容易让使用者迷惑的3个属性是durable、exclusive和auto_delete。

上图所示为consumer从queue进行消息消费时用于设置属性的结构体。其中最容易让使用者迷惑的属性是exclusive(上图中的exclusive注释有点问题,请忽略)。

测试过程

在编写python语言的测试程序时,我将行为分为以下几步

  • 声明7个具有不同属性的queue,分别和名为test_exchage的exchange进行绑定(因为exchange为fanout类型,所以测试代码中的routing_key其实是不起作用的);
  • 向exchange发送具有persistent属性的消息(delivery_mode=2);
  • 创建7个消费者分别从上述7个queue中获取消息;

测试结果如下

可以看到,所有的7个消费者均收到了对应的消息内容。

下面我们从RabbitMQ服务器测查看以下上述测试能展现什么信息。

1.client和server建立了一条AMQP connection。

2.在该connection上使用了channel号1进程AMQP协议通信。

3.连接建立时的用户名为guest,以及各种channel属性设置情况。

4.在当前channel上共存在7个消费者,分别从7个不同的queue上获取消息;该channel上的消息均来自名为test_exchage的exchange(请原谅我测试过程中的英文拼写错误)。

从Exchanges选项卡上可以看到test_exchage下绑定了哪些queue。

从Queues选项卡上可以看到全部7个queue的属性情况

看到这里,眼尖的同学可能会发现问题所在了,那就是客户端代码中声明的queue属性并没有全部生效,为什么会这样呢?

首先分别看一下代码中声明的7个queue在服务器侧的详细信息。

a.test_1_queue没有设置任何属性,在界面上没有看到任何属性。

b. test_2_queue设置了durable属性,在界面上看到了“durable:true”。

c. test_3_queue设置了auto-delete属性,在界面上看到了“auto-delete:true”。

d. test_4_queue同时设置了durable和auto-delete属性,在界面上看到了“durable:true和auto-delete:true”。

e. test_5_queue同时设置了durable和exclusive属性,但在界面上只看到了“Exlusive owner”的存在。

f. test_6_queue同时设置了auto_delete和exclusive属性,在界面上同时看到“auto-delete:true”和“Exlusive owner”的存在。

g. test_7_queue同时设置了durable、auto_delete和exclusive属性,在界面上只看到了“auto-delete:true”和“Exlusive owner”的存在。

综上,可以得出如下结论

  • durable属性和auto-delete属性可以同时生效
  • durable属性和exclusive属性会有性质上的冲突,两者同时设置时,仅exclusive属性生效
  • auto_delete属性和exclusive属性可以同时生效

除此之外,还能得到其它一些有趣的结论:

  • Queue的“Exlusive owner”对应的是connection而不是channel
  • Consumer存在于某个channel上的

附上一张客户端同时设置durable、auto_delete和exclusive属性的抓包截图:

下面通过改变client侧代码,模拟不同情况下各种属性对queue的存在情况的影响。

a.在成功创建全部7queue后,通过Ctrl+C异常终止客户端程序。

(上图为全部创建时的状态)

停止后,queue的情况如下图所示。

对比发现,此时只有 test_1_queue 和 test_2_queue 仍旧存在,其它queue已经被RabbitMQ服务器删除掉了(思考原因)。

b.客户端侧执行到消息发送后,结束当前操作(无consumer情况)。代码调整如下

此时仍旧可以看到queue的声明和绑定都是成功的。

此时客户端程序执行后会自动退出

再从web页面查看queue的情况如下

对比发现,此时仅test_1_queue、test_2_queue、test_3_queue和test_4_queue 存在(思考原因)。

这里有个细节值得说一下:虽然最终我们在web页面上只看到了4个queue的存在,但其实7个queue都被成功创建过(抓包可以证明),如果你够幸运,你也可能在web页面上看到一闪而过的另外3个queue。通过对比可以发现,导致另外3个queue消失的原因是exclusive属性的设置,前面我已经说过,queue的“Exlusive owner”对应的是connection,所以在这个实验中可以确定的是,connection仍旧是存在的(这里遗留个问题:为什么python执行退出后连接仍旧存在),而此时实际上不存在的是consumer,所以需要对之前得到的结论进行加强:具有exclusive属性的queue的存在条件是在connection上存在某个consumer订阅了该queue同样可以得到另外一个结论:可以在没有创建consumer的情况下,创建出具有auto-delete属性的queue

在RabbitMQ官方文档中其实已经对上述现象进行了说明,只不过一语带过,不注意的话容易忽略掉。在queue.declare方法中包含如下属性说明

此时肯定有人会问,除了queue.declare中具有exclusive属性,basic.consume中也具有exclusive属性,后者是什么含义呢?在文档说明中有如下内容

由此可以理解两个属性的差异和实际使用中应该注意的问题是什么!(自行思考)

在此情况下,若执行RabbitMQ server的重启(rabbitmqctl stop_app;rabbitmqctl start_app),可以看到仅有test_2_queue和test_4_queue仍旧存在。

测试版本

以上测试基于如下RabbitMQ版本

为什么使用这个版本?(我猜肯定有人会问)因为这个实验是我半年前就已经完成了的~~

转载于:https://my.oschina.net/moooofly/blog/392239

【原创】RabbitMQ之Queue属性测试相关推荐

  1. RabbitMQ 声明Queue时的参数们的Power

    RabbitMQ 声明Queue时的参数们的Power 参数们的Power 在声明队列的时候会有很多的参数 public static QueueDeclareOk QueueDeclare(this ...

  2. [原创]《敏捷软件测试:测试人员与敏捷团队的实践指南》一书思维图初稿版...

    [原创]<敏捷软件测试:测试人员与敏捷团队的实践指南>一书思维图初稿版 书名:<敏捷软件测试:测试人员与敏捷团队的实践指南> 购买地址:http://product.dangd ...

  3. RabbitMQ的Queue详解;

    一.前言 Queue(队列)是RabbitMQ的内部对象,用于存储消息队列,并将它们转发给消费者: 二.Queue队列 队列跟交换机共享某些属性,但是队列也有一些另外的属性 Name:队列的名称 Du ...

  4. RabbitMQ之队列属性

    前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...

  5. win10 rabbitMQ的安装与测试

    安装 1.首先,下载并运行Erlang for Windows 安装程序 (地址:http://www.erlang.org/downloads)下载完毕并安装(注意:安装目录请选择默认目录) 2.下 ...

  6. RabbitMQ 安装和简单测试

    2019独角兽企业重金招聘Python工程师标准>>> 最近好多项目都有需要是用MQ的场景,以下是在安装过程记录的一些知识点,安装MQ需要先安装依赖环境,erlang和socat. ...

  7. 五、RabbitMQ的消息属性(读书笔记)

    2019独角兽企业重金招聘Python工程师标准>>> 简介 当使用RabbitMQ发布消息时,消息又AMQP规范中的三个低层帧类型组成: Basic.publish方法帧: 内容头 ...

  8. RabbitMq队列 queue

    目录 RabbitMq队列 消息确认机制 负载均衡 生产者代码 消费者1 消费者2 RabbitMq队列 在上篇文章中讲了mq的队列,这篇用代码实现.在例子中存在一个生产者,和两个消费者.生产者将生产 ...

  9. rabbitmq监控queue中message数量

    2019独角兽企业重金招聘Python工程师标准>>> 头儿让整一个jar包干这活,学了一下rabbitmq,但这东西中文文档很少,就认真读了读官方的英文文档.官方文档提供了两种方法 ...

最新文章

  1. EMC:欲占企业数据中心市场大半江山
  2. python显示行数_jupyter notebook实现显示行号
  3. Javascript Step by Step - 03
  4. MyBatis 源码分析系列文章合集
  5. 计算机二级操作范文,计算机二级考试(范文).doc
  6. Java总结:正则表达式进行校验
  7. Mybatis源码阅读(三):结果集映射3.3 —— 主键生成策略
  8. 怎么给图片降噪?WidsMob Denoise 图片降噪教程
  9. 最近任务 react文章列表
  10. python出现unexpected indent_Python、unexpected indent错误解决方法
  11. [Python]跟着代码去学习---二维码1:批量生成二维码
  12. can是什么时候处于显性_CAN总线什么情况下为空闲状态? - 全文
  13. 世界时间查询服务器(一)
  14. Mac M1芯片处理器能用的Bridge 2020/2019 for mac 解决M1版MAC安装BR无法安装问题 完美支持M1芯片处理器
  15. java后端实习第一个月总结
  16. 支持DoH的DNS服务器,谷歌公共DNS正式支持DoH加密 更安全并且不影响速度
  17. OLTP与OLAP理解
  18. (4)复函数与拉普拉斯变换
  19. 【React】二.JSX
  20. 每日三个笑话-20151013

热门文章

  1. centos 6.5 安装 lamp 后mysql不能启动_Lamp的搭建--centos6.5下安装mysql
  2. MappedByteBuffer VS FileChannel 孰强孰弱?
  3. Linux基础命令---fold
  4. 磁盘分区原理:从MBR到GPT
  5. 充电网完成数千万元Pre-B轮融资,将会聚焦新能源乘用车市场
  6. 电信/移动/联通同台秀肌肉 集体表态:云计算市场“不能丢”!
  7. 《深入理解Android》一2.1 浏览器工作原理概述
  8. ssh-add Could not open a connection to your authentication agent.
  9. 用Telnet 来用smtp发邮件。。 send mail by SMTP server
  10. 乙肝相关药物服用信息汇总