文档章节

【原创】RabbitMQ之Queue属性测试

摩云飞
 摩云飞
发布于 2015/03/26 19:40
字数 1529
阅读 3080
收藏 56

常用queue属性

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

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

上图所示为
consumerqueue进行消息消费时用于设置属性的结构体。其中最容易让使用者迷惑的属性是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上使用了channel1进程AMQP协议通信。

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

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

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

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

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

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

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

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

 

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

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

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

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

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

综上,可以得出如下结论

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

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

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

 附上一张客户端同时设置durableauto_deleteexclusive属性的抓包截图:

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

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

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

 

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

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

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

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

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

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

对比发现,此时仅test_1_queuetest_2_queuetest_3_queuetest_4_queue 存在(思考原因)。

      这里有个细节值得说一下:虽然最终我们在web页面上只看到了4queue的存在,但其实7queue都被成功创建过(抓包可以证明),如果你够幸运,你也可能在web页面上看到一闪而过的另外3queue。通过对比可以发现,导致另外3queue消失的原因是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_queuetest_4_queue仍旧存在。

测试版本

以上测试基于如下RabbitMQ版本

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



© 著作权归作者所有

摩云飞
粉丝 375
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
在Kubernetes上使用Sateful Set部署RabbitMQ集群

前面我们已经在Kubernetes上部署了Redis – 《在Kubernetes上使用Sateful Set部署Redis》。 本篇我们继续把RabbitMQ也跑在K8S上。 1.RabbitMQ的基础知识 在正式开始部署工作之前,我们先来复...

店家小二
2018/12/14
0
0
zabbix自动发现rabbitmq

参考文档 http://blog.csdn.net/qq29778131/article/details/52537288?ticket=ST-77459-cUGNcZF1BJBtNuZoZe1i-passport.csdn.net #python脚本 一,实现功能 实现自动发现rabbitmq queue,并监......

typuc
2018/06/26
0
0
【原创】RabbitMQ 之 no_ack 分析

熟悉 RabbitMQ 的人肯定知道 noack 属性是在调用 Basic.Consume 方法时可以设置的一个重要参数。本文主要针对 noack 设置的两种情况,通过抓包分析的形式讲解下实际应用中的异同,并总结一下...

摩云飞
2013/07/10
8.2K
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 RabbitMQ是一个消息中间件,是一个很好用的消息队列框架,这里有几个关键的名词: ConnectionFactory、Connection、Channel ConnectionFactory、Connection、Channel都是Rabbi...

Java烂猪皮
2018/09/16
27
0
Springboot 集成rabbitmq

RabbitMQ是一款基于AMQP(消息队列协议),由Erlang开发的开源消息队列组件。是一款优秀的消息队列组件,他由两部分组成:服务端和客户端,客户端支持多种语言的驱动,如:.Net、JAVA、Erlan...

江火似流萤
2017/11/02
92
0

没有更多内容

加载失败,请刷新页面

加载更多

Activity启动模式二

上篇文章Activity启动模式一主要介绍了Activity的四种启动模式,这些启动模式都是在AndroidManifest中进行配置的。除此之外,Android系统还通过Intent类提供了一些标志位,同样可以指定Activ...

ltlovezh
刚刚
0
0
三原色还原

1、Color Filter Array — CFA 随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式...

天王盖地虎626
11分钟前
2
0
kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
49分钟前
6
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部