使用 RabbitMQ 和 RocketMQ 的人是幸運的,因為這兩個 MQ 自身提供了延遲隊列的實現,不像用 Kafka 的同學那么苦逼,還要自己實現延遲隊列。當然,這都是題外話,今天咱們重點來聊聊 RabbitMQ 延遲隊列的實現原理,以及 RabbitMQ 實現延遲隊列的優缺點有哪些?
很多人知道使用 RabbitMQ 是可以實現延遲隊列的,但對于 RocketMQ 自身也提供了延遲隊列這件事卻持有不同態度,這是因為網上有些資料說 RocketMQ 和 Kafka 沒有內置延遲隊列。其實這種說法是因為,RocketMQ 在早期版本中確實沒有內置延遲隊列,但在 4.x 就內置了 18 個級別的延遲隊列了(最長支持 2 小時的延遲隊列),5.x 就支持隨機延遲時間的延遲隊列了,所以這里需要特殊強調一下。
延遲隊列(Delay Queue)是一種特殊類型的隊列,它的主要特點是可以讓進入隊列的元素在指定的延遲時間之后才被取出進行處理。
延遲隊列的主要使用場景有以下這些:
那么延遲隊列的實現方式有哪些呢?
延遲隊列的實現方式通常有以下幾種:
我們通常會使用延遲隊列來存儲(和實現)延遲消息,所以大部分時候,我們說的延遲隊列和延遲消息其實是一回事。
使用 RabbitMQ 實現延遲隊列有以下兩種實現方式:
早期大部分公司都會采用第一種方式,而隨著 RabbitMQ 3.5.7(2015 年底發布)的延遲插件的發布,因為其使用更簡單、更方便,所以它現在才是大家普通會采用的,實現延遲隊列的方式。
使用延遲插件的實現原理是通過創建一個延遲交換機(Delay Exchange),延遲消息首先會把消息投遞到延遲交換機,并不是直接將消息投遞業務隊列(所以不會立即執行),由延遲交換機控制消息在延遲一段時間后,再將消息投遞到真正的隊列中進行消費,從而實現延遲隊列,它的實現流程如下圖所示:
其中 Mnesia 可以理解為基于文件存儲的數據庫。
使用死信隊列實現延遲任務有個缺點,它不能實現隨機延遲任務,每個無消費者的隊列上只能設置一個 ttl(消息過期時間),所以只能實現固定過期時間的延遲任務。
使用延遲插件實現延遲任務有以下兩個缺點:
本文鏈接:http://www.tebozhan.com/showinfo-26-101269-0.html說說MQ延遲隊列實現原理?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 微前端代碼隔離方案,手把手實現一個 JS 沙箱隔離!
下一篇: 不掉頭發“逆向”旋轉驗證碼