【原创】RabbitMQ之Queue属性测试

常用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版本

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

时间: 2024-12-31 04:53:44

【原创】RabbitMQ之Queue属性测试的相关文章

【原创】RabbitMQ 之 Queue Length Limit(翻译)

Queue Length Limit The maximum length of a queue can be limited to a set number of messages by supplying the x-max-lengthqueue declaration argument with a non-negative integer value. Queue length is a measure that takes into account ready messages, i

【原创】RabbitMQ之PublisherConfirm实战问题总结

如何理解Publisher Confirm机制       Publisher Confirm机制(又称为Confirms或Publisher Acknowledgements)是作为解决事务机制性能开销大(导致吞吐量下降)而提出的另外一种保证消息不会丢失的方式. Publisher Confirm的协议交互过程 (补充说明:上图中未显示出info信息的两条交互对应的就是 Confirm.Select 和 Confirm.Select-ok ,显示不出来是因为 wireshark 没有对该扩展进

Kafka、RabbitMQ、RocketMQ消息中间件的对比—— 消息发送性能

引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. 那么,消息中间件性能究竟哪家强? 带着这个疑问,我们中间件测试组对常见的三类消息产品(Kafka.RabbitMQ.RocketMQ)做了性能比较.   Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目.Kafka主要特点是基于Pull的模式来处理消息消费,

测试并发应用(九)MultithreadedTC测试并发代码

MultithreadedTC测试并发代码 MultithreadedTC 是一个 Java 库用来测试并发应用.它的主要目的是为了解决并发应用的不确定的问题.你不能控制他们的执行顺序.为了这个目睹,它包含了内部节拍器来控制应用的不同线程的执行顺序.这些测试线程作为类的方法来实现的. 在这个指南,你将学习如何使用 MultithreadedTC 库来为LinkedTransferQueue 实现一个测试. 准备 你必须从 http://code.google.com/p/ multithread

RabbitMQ如何实现延迟队列?

什么是延迟队列 延迟队列存储的对象肯定是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行一场处理.这是就可以使用延迟队列将订单信息发送到延迟队列. 场景二:用户希望通过手机远程遥控家里的智能设备在指定的时间进行工作.这时候就可以将用户指令发送到延迟队列,当指令设定的时间到了再将指令推送到

51Testing专访史亮:测试人员在国外

版权声明:51Testing软件测试网原创出品,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明,否则将追究法律责任. 史亮,东南大学计算机软件与理论专业博士,研究领域为软件分析与测试.2006年加入微软(中国)有限公司,任职软件开发测试工程师,负责微软在线业务与商业智能产品的测试工作.2011年调至微软总部,从事Microsoft Office 2013的测试工作.2012年与淘宝测试工程师高翔合著了<探索式软件测试实践之路>一书.2014年,独自出版了<软件测试实战:微软技

RabbitMQ原理

RabbitMQ原理 前一段时间研究RabbitMQ的时候,发现官网.网上博客的内容比较零散,所以整理了一下官网内容以及其他人的博客内容,整理出下面一篇RabbitMQ原理.主要内容如下: 基础概念:Exchange, Routing key, Binding, Binding key, Exchange Types, RPC, 通信过程 架构相关:Virtual host, 消息存储, GC过程, 性能优化, Message,流控 队列详解:普通队列, 镜像队列 集群原理:基础概念, 服务可用

Queue 和Stack 的区别

protected void Page_Load(object sender, EventArgs e) { //queue 是队列,遵循先进先出的原则 //queue 属性 count // queue method Clear() //清空 //Contains() //是否包含 //Dequeue() //出列 //Enqueue() //入列 Queue queue = new Queue(); queue.Enqueue("abc"); queue.Enqueue(123);

《OEA - 实体扩展属性系统 - 设计方案说明书》

 这篇设计文档是 12 月份写来参加公司的研发峰会的,自己倒是信心满满,不过最后还是没有入围.现在想想也没啥大用,所以贴出来,期待与园友交流.     文档有点长,没全部贴在博客中,有兴趣的可以下载附件中的 PDF.  附件:<实体扩展属性系统-系统设计说明书.pdf> ================= 分隔线 ======================     目录 前言... 4 1 背景与需求... 5 1.1 产品 721 客户化开发的需要... 5 1.2 实体动态列... 6