无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網 會員登陸 & 注冊

RabbitMQ高級之消息限流與延時隊列

2020-09-04 10:34 作者:微軟MVP-Eleven  | 我要投稿

1. 消息隊列如何限流?

消息隊列限流是指在服務器面臨巨額流量時,為了進行自保,進行的一種救急措施。

因為巨大的流量代表著非常多的消息,這些消息如果多到服務器處理不過來就會造成服務器癱瘓,影響用戶體驗,造成不良影響。

所以要進行一次降級操作,把處理不了的流量隔絕在系統之外,避免它們打垮系統。

基本上任何一個消息隊列都有限流的功能,今天我們就來看看在RabbitMQ之中進行限流具體應該怎么做?

RabbitMQ提供了一種QOS(服務質量保證)功能,即在非自動確認消息的前提下,如果一定數目的消息還未被消費確認,則不進行新消息的消費。



我們只需要配置一下rabbitmq.listener.simple下的prefetch屬性即可,為了演示方便我這里配置為兩條,語義即為:如果隊列中有兩條以上未簽收的消息,則不進行新的消息消費。

我往我的隊列中發(fā)送三條信息,并不進行簽收,來看看效果:



發(fā)送完顯示我們系統中有三條Ready消息,這代表這三條消息還在隊列中沒有消費端去消費。

這時我打開消費端進行消費但依舊不進行簽收,接著來看效果:



unacked=2,ready=1,這就代表有兩條消息在服務端消費了但是沒有簽收,還有一條消息還在隊列中沒有往服務端推送,因為我們設置了prefetch=2,所以現在隊列的最大同時在消費的消息數量為2,通過此種方式,我們就完成了消費限流。


Tip : 這種方式下消息一定要進行手動簽收,因為之前的文章中我們講過,自動簽收是消息一達到消費端就進行簽收了,可能我們的業(yè)務邏輯還沒運行就已經進行簽收了,所以自動簽收狀態(tài)下開啟限流幾乎沒有作用。


2. RabbitMQ控制臺

上一節(jié)我的截圖中,大家可以發(fā)現居然出現了可視化的界面,以往在我的截圖中一般都是DOS命令操作臺界面,但其實RabbitMQ是自帶了可視化界面的插件的,我們只需要開啟即可。

在我們的RabbitMQ中輸入如下命令:rabbitmq-plugins.bat enable rabbitmq_management

就可以開啟可視化頁面了,緊接著訪問:http://localhost:15672/



默認用戶名和密碼都是 guest,直接登錄即可。



很方便的控制臺,大家可以自己試一下~


3. TTL消息/隊列

TTL是Time To Live的縮寫,也就是生存時間的意思,RabbitMQ支持消息的過期時間,在消息發(fā)送時可以進行指定,也支持隊列的過期時間,從消息入隊列開始計算,只要超過了隊列的超時時間配置,那么消息會自動的清除。

設置隊列的話就是整個隊列的消息到時都會過期,設置消息的話就是單條消息到時自動過期。

上面的代碼就是演示如何創(chuàng)建一個TTL隊列,需要放入參數才行,隊列構造中的其他參數我為了方便直接填了false。



設置消息的TTL也是設置參數即可。

以上就是RabbitMQ中關于TTL的知識點。


4. DLX死信隊列

DLX死信隊列雖然叫隊列,但其實指的是Exchange,或者說指的Exchange和它所屬的Queue,他倆一塊構成了死信隊列。

當一條消息:

  • 消費被拒絕(basic.reject/basic.nack)并且requeue=false

  • TTL過期

  • 要進入的隊列達到最大長度

這三種情況,就可以判定一條消息死了,這種消息如果我們沒有做處理,它就會被自動刪除。


但其實我們可以在隊列上加上一個參數,使當隊列中發(fā)現了死亡的消息之后會將它自動轉發(fā)到某個Exchange,由指定的Exchange來處理這些死亡的消息。

這個處理死亡消息的Exchange和之前我們講述的Exchange沒什么區(qū)別,依然可以綁定隊列然后進行消息消費。



如上代碼,就是設置了一個隊列中的消息死亡后的去處,就等于消息死亡后給它不把它刪掉而是做一次轉發(fā),發(fā)到其他Exchange去。

那這樣搞有什么用呢?這就取決于業(yè)務需求了,不過下一節(jié)會用到它,接著往下看~


5. 延時隊列

RabbitMQ的基因中沒有延時隊列這回事,它不能直接指定一個隊列類型為延時隊列,然后去延時處理,但是經過上面兩節(jié)的鋪墊,我們可以將TTL+DLX相結合,這就能組成一個延時隊列。


設想一個場景,下完訂單之后15分鐘未付款我們就要將訂單關閉,這就是一個很經典的演示消費的場景,如果拿RabbitMQ來做,我們就需要結合TTL+DLX了。


先把訂單消息設置好15分鐘過期時間,然后過期后隊列將消息轉發(fā)給我們設置好的DLX-Exchange,DLX-Exchange再將分發(fā)給它綁定的隊列,我們的消費者再消費這個隊列中的消息,就做到了延時十五分鐘消費。真是super~~~簡單呢


后記

收尾了收尾了,RabbitMQ結束了,雖然有些東西沒有講比如:鏡像隊列,因為我沒用過而且一般輪不到自己來做這個,所以就懶了一下就不寫這個了,RabbitMQ畢竟不是一個天生的分布式消息隊列,弄鏡像什么的還是有點麻煩的。

本文轉載自博客園:

cnblogs.com/he-erduo/p/


RabbitMQ高級之消息限流與延時隊列的評論 (共 條)

分享到微博請遵守國家法律
淳化县| 小金县| 彩票| 图们市| 尉犁县| 民权县| 曲靖市| 武功县| 准格尔旗| 保靖县| 泸定县| 克拉玛依市| 湘潭县| 犍为县| 互助| 农安县| 独山县| 宁津县| 桦川县| 浮山县| 家居| 富源县| 巩义市| 阿拉善盟| 壤塘县| 莫力| 广元市| 宜黄县| 锡林浩特市| 安仁县| 将乐县| 正宁县| 当阳市| 长汀县| 深水埗区| 崇阳县| 台北市| 泰安市| 永寿县| 米脂县| 伊春市|