一、消息丟失的問題
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)