【原创】RabbitMQ之Queue属性测试
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
常用queue屬性
在 rabbitmq-c代碼中可以看到如下代碼
上圖所示為queue聲明時(shí)使用的結(jié)構(gòu)體。其中最容易讓使用者迷惑的3個(gè)屬性是durable、exclusive和auto_delete。
上圖所示為consumer從queue進(jìn)行消息消費(fèi)時(shí)用于設(shè)置屬性的結(jié)構(gòu)體。其中最容易讓使用者迷惑的屬性是exclusive(上圖中的exclusive注釋有點(diǎn)問(wèn)題,請(qǐng)忽略)。
測(cè)試過(guò)程
在編寫python語(yǔ)言的測(cè)試程序時(shí),我將行為分為以下幾步
- 聲明7個(gè)具有不同屬性的queue,分別和名為test_exchage的exchange進(jìn)行綁定(因?yàn)閑xchange為fanout類型,所以測(cè)試代碼中的routing_key其實(shí)是不起作用的);
- 向exchange發(fā)送具有persistent屬性的消息(delivery_mode=2);
- 創(chuàng)建7個(gè)消費(fèi)者分別從上述7個(gè)queue中獲取消息;
測(cè)試結(jié)果如下
可以看到,所有的7個(gè)消費(fèi)者均收到了對(duì)應(yīng)的消息內(nèi)容。?
下面我們從RabbitMQ服務(wù)器測(cè)查看以下上述測(cè)試能展現(xiàn)什么信息。
1.client和server建立了一條AMQP connection。
2.在該connection上使用了channel號(hào)1進(jìn)程AMQP協(xié)議通信。
3.連接建立時(shí)的用戶名為guest,以及各種channel屬性設(shè)置情況。
4.在當(dāng)前channel上共存在7個(gè)消費(fèi)者,分別從7個(gè)不同的queue上獲取消息;該channel上的消息均來(lái)自名為test_exchage的exchange(請(qǐng)?jiān)徫覝y(cè)試過(guò)程中的英文拼寫錯(cuò)誤)。
從Exchanges選項(xiàng)卡上可以看到test_exchage下綁定了哪些queue。
從Queues選項(xiàng)卡上可以看到全部7個(gè)queue的屬性情況
看到這里,眼尖的同學(xué)可能會(huì)發(fā)現(xiàn)問(wèn)題所在了,那就是客戶端代碼中聲明的queue屬性并沒有全部生效,為什么會(huì)這樣呢?
首先分別看一下代碼中聲明的7個(gè)queue在服務(wù)器側(cè)的詳細(xì)信息。
a.test_1_queue沒有設(shè)置任何屬性,在界面上沒有看到任何屬性。
b. test_2_queue設(shè)置了durable屬性,在界面上看到了“durable:true”。
?
c. test_3_queue設(shè)置了auto-delete屬性,在界面上看到了“auto-delete:true”。
d. test_4_queue同時(shí)設(shè)置了durable和auto-delete屬性,在界面上看到了“durable:true和auto-delete:true”。
e. test_5_queue同時(shí)設(shè)置了durable和exclusive屬性,但在界面上只看到了“Exlusive owner”的存在。
f. test_6_queue同時(shí)設(shè)置了auto_delete和exclusive屬性,在界面上同時(shí)看到“auto-delete:true”和“Exlusive owner”的存在。
g. test_7_queue同時(shí)設(shè)置了durable、auto_delete和exclusive屬性,在界面上只看到了“auto-delete:true”和“Exlusive owner”的存在。
綜上,可以得出如下結(jié)論
- durable屬性和auto-delete屬性可以同時(shí)生效;
- durable屬性和exclusive屬性會(huì)有性質(zhì)上的沖突,兩者同時(shí)設(shè)置時(shí),僅exclusive屬性生效;
- auto_delete屬性和exclusive屬性可以同時(shí)生效;
除此之外,還能得到其它一些有趣的結(jié)論:
- Queue的“Exlusive owner”對(duì)應(yīng)的是connection而不是channel;
- Consumer存在于某個(gè)channel上的;
?附上一張客戶端同時(shí)設(shè)置durable、auto_delete和exclusive屬性的抓包截圖:
下面通過(guò)改變client側(cè)代碼,模擬不同情況下各種屬性對(duì)queue的存在情況的影響。
a.在成功創(chuàng)建全部7個(gè)queue后,通過(guò)Ctrl+C異常終止客戶端程序。
(上圖為全部創(chuàng)建時(shí)的狀態(tài))
?
?停止后,queue的情況如下圖所示。
對(duì)比發(fā)現(xiàn),此時(shí)只有 test_1_queue 和 test_2_queue 仍舊存在,其它queue已經(jīng)被RabbitMQ服務(wù)器刪除掉了(思考原因)。
b.客戶端側(cè)執(zhí)行到消息發(fā)送后,結(jié)束當(dāng)前操作(無(wú)consumer情況)。代碼調(diào)整如下
此時(shí)仍舊可以看到queue的聲明和綁定都是成功的。
此時(shí)客戶端程序執(zhí)行后會(huì)自動(dòng)退出
再?gòu)?/span>web頁(yè)面查看queue的情況如下
對(duì)比發(fā)現(xiàn),此時(shí)僅test_1_queue、test_2_queue、test_3_queue和test_4_queue 存在(思考原因)。
? ? ? 這里有個(gè)細(xì)節(jié)值得說(shuō)一下:雖然最終我們?cè)?/span>web頁(yè)面上只看到了4個(gè)queue的存在,但其實(shí)7個(gè)queue都被成功創(chuàng)建過(guò)(抓包可以證明),如果你夠幸運(yùn),你也可能在web頁(yè)面上看到一閃而過(guò)的另外3個(gè)queue。通過(guò)對(duì)比可以發(fā)現(xiàn),導(dǎo)致另外3個(gè)queue消失的原因是exclusive屬性的設(shè)置,前面我已經(jīng)說(shuō)過(guò),queue的“Exlusive owner”對(duì)應(yīng)的是connection,所以在這個(gè)實(shí)驗(yàn)中可以確定的是,connection仍舊是存在的(這里遺留個(gè)問(wèn)題:為什么python執(zhí)行退出后連接仍舊存在),而此時(shí)實(shí)際上不存在的是consumer,所以需要對(duì)之前得到的結(jié)論進(jìn)行加強(qiáng):具有exclusive屬性的queue的存在條件是在connection上存在某個(gè)consumer訂閱了該queue。同樣可以得到另外一個(gè)結(jié)論:可以在沒有創(chuàng)建consumer的情況下,創(chuàng)建出具有auto-delete屬性的queue。
在RabbitMQ官方文檔中其實(shí)已經(jīng)對(duì)上述現(xiàn)象進(jìn)行了說(shuō)明,只不過(guò)一語(yǔ)帶過(guò),不注意的話容易忽略掉。在queue.declare方法中包含如下屬性說(shuō)明
此時(shí)肯定有人會(huì)問(wèn),除了queue.declare中具有exclusive屬性,basic.consume中也具有exclusive屬性,后者是什么含義呢?在文檔說(shuō)明中有如下內(nèi)容
由此可以理解兩個(gè)屬性的差異和實(shí)際使用中應(yīng)該注意的問(wèn)題是什么!(自行思考)
在此情況下,若執(zhí)行RabbitMQ server的重啟(rabbitmqctl stop_app;rabbitmqctl start_app),可以看到僅有test_2_queue和test_4_queue仍舊存在。
測(cè)試版本
以上測(cè)試基于如下RabbitMQ版本
為什么使用這個(gè)版本?(我猜肯定有人會(huì)問(wèn))因?yàn)檫@個(gè)實(shí)驗(yàn)是我半年前就已經(jīng)完成了的~~
轉(zhuǎn)載于:https://my.oschina.net/moooofly/blog/392239
總結(jié)
以上是生活随笔為你收集整理的【原创】RabbitMQ之Queue属性测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【转】搭建Java版WebService
- 下一篇: GCD之after