【RocketMQ】讀寫隊列


一. 讀寫隊列,是在路由時使用

在消息發送時,根據寫隊列個數返回路由信息,而消息消費時按照讀隊列個數返回路由信息。

二. 在物理文件層面,只有寫隊列才會創建文件

舉個例子:寫隊列個數是8,設置的讀隊列個數是4. 這個時候,會創建8個文件夾,代表0 1 2 3 4 5 6 7,但在消息消費時,路由信息只返回4,在具體拉取消息時,就只會消費0 1 2 3這4個隊列中的消息,4 5 6 7中的信息壓根就不會被消費。

反過來,如果寫隊列個數是4,讀隊列個數是8,在生產消息時只會往0 1 2 3中生產消息,消費消息時則會從0 1 2 3 4 5 6 7所有的隊列中消費,當然 4 5 6 7中壓根就沒有消息 ,假設ConsumerGroup有兩個消費者,事實上只有第一個消費者在真正的消費消息(0 1 2 3),第二個消費者壓根就消費不到消息。

三. 只有readQueueNums>=writeQueueNums,程序才能正常進行

最佳實踐是readQueueNums=writeQueueNums。那rocketmq為什么要區分讀寫隊列呢?直接強制readQueueNums=writeQueueNums,不就沒有問題了嗎?rocketmq設置讀寫隊列數的目的在於方便隊列的縮容和擴容。

四. 一個問題

一個topic在每個broker上創建了128個隊列,現在需要將隊列縮容到64個,怎么做才能100%不會丟失消息,並且無需重啟應用程序?最佳實踐:先縮容寫隊列128->64,寫隊列由0 1 2 ......127縮至 0 1 2 ........63。等到64 65 66......127中的消息全部消費完后,再縮容讀隊列128->64(同時縮容寫隊列和讀隊列可能會導致部分消息未被消費)

五. Perm(Topic的讀寫模式)

6:同時支持讀寫
4:禁寫
2:禁讀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM