RocketMQ面試遇到的問題(上)

一、消息丟失的問題

1.?當你系統(tǒng)需要保證百分百消息不丟失,你可以使用生產(chǎn)者每發(fā)送一個消息,Broker 同步返回一個消息發(fā)送成功的反饋消息

2. 即每發(fā)送一個消息,同步落盤后才返回生產(chǎn)者消息發(fā)送成功,這樣只要生產(chǎn)者得到了消息發(fā)送生成的返回,事后除了硬盤損壞,都可以保證不會消息丟失

3. 但是這同時引入了一個問題,同步落盤怎么才能快?

二、同步落盤怎樣才能更快

1、使用 FileChannel + DirectBuffer 池,使用堆外內(nèi)存,加快內(nèi)存拷貝

2、使用數(shù)據(jù)和索引分離,當消息需要寫入時,使用 commitlog 文件順序寫,當需要定位某個消息時,查詢index 文件來定位,從而減少文件IO隨機讀寫的性能損耗

三、消息堆積的問題

1、后臺定時任務每隔72小時,刪除舊的沒有使用過的消息信息

2、根據(jù)不同的業(yè)務實現(xiàn)不同的丟棄任務,具體參考線程池的 AbortPolicy,例如FIFO/LRU等(RocketMQ沒有此策略)

3、消息定時轉移,或者對某些重要的 TAG 型(支付型)消息真正落庫

四、消息的定時實現(xiàn)

1、實際 RocketMQ 沒有實現(xiàn)任意精度的定時消息,它只支持某些特定的時間精度的定時消息

2、實現(xiàn)定時消息的原理是:創(chuàng)建特定時間精度的 MessageQueue,例如生產(chǎn)者需要定時1s之后被消費者消費,你只需要將此消息發(fā)送到特定的 Topic,例如:MessageQueue-1 表示這個 MessageQueue 里面的消息都會延遲一秒被消費,然后 Broker 會在 1s 后發(fā)送到消費者消費此消息,使用 newSingleThreadScheduledExecutor 實現(xiàn)

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容