上圖是通過RocketMQ源碼分析一個實現原理方案示意圖。
分為兩個部分:
消息的寫入
消息的Schedule
在寫入CommitLog之前,如果是延遲消息,按照每10分鍾寫入delayfile文件,對於快到時間執行的,直接寫入時間輪,並且寫入delayfile
,時間輪每秒鍾執行,如果時間到了,就執行隊列中的任務,寫入commitlog文件中,commitlog會自動寫入 comsumqueue中,然后客戶端就能消費到了。
為什么delayfile文件保存10分鍾的數據呢,考慮到時間輪不能太多任務在里面,保存10分鍾內的數據,也不會占用太多的內存
開源rocketmq延遲隊列實現:
https://gitee.com/venus-suite/rocketmq-with-delivery-time.git