日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【原创】RabbitMQ之Queue属性测试

發(fā)布時(shí)間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【原创】RabbitMQ之Queue属性测试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>


常用queue屬性

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

上圖所示為
queue聲明時(shí)使用的結(jié)構(gòu)體。其中最容易讓使用者迷惑的3個(gè)屬性是durableexclusiveauto_delete

上圖所示為
consumerqueue進(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_exchageexchange(請(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è)置了durableauto-delete屬性,在界面上看到了“durable:trueauto-delete:true”。

e. test_5_queue同時(shí)設(shè)置了durableexclusive屬性,但在界面上只看到了“Exlusive owner”的存在。

f. test_6_queue同時(shí)設(shè)置了auto_deleteexclusive屬性,在界面上同時(shí)看到“auto-delete:true”和“Exlusive owner”的存在。

g. test_7_queue同時(shí)設(shè)置了durableauto_deleteexclusive屬性,在界面上只看到了“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è)置durableauto_deleteexclusive屬性的抓包截圖:

下面通過(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_queuetest_2_queuetest_3_queuetest_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_queuetest_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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。