佇列mq 相關

antor發表於2024-08-11

1. 佇列相關

什麼是訊息佇列

訊息佇列是一種非同步的通訊方式, 用於在分散式系統中管理訊息傳遞。
採用了生產者消費者模式,生產者將訊息傳送到佇列,消費者負責從佇列接收訊息

佇列的好處

使用佇列的核心好處主要有3個,分別是 解耦、非同步和削峰

2. rocket 相關

2.1 rocket mq 如何做到訊息不丟失

1. 刷盤機制 
rocketMq 中的訊息分為記憶體訊息和磁碟訊息,記憶體訊息在broker 記憶體中進行讀寫,磁碟訊息則儲存在磁碟上
rocket 支援同步刷盤和非同步刷盤兩種,透過刷盤機制可以確保broker 當機時資料不會丟失. 
在同步刷盤模式下,訊息寫入磁碟會等待磁碟的寫入完成才返回寫入成功的響應
在非同步刷盤模式下,訊息寫入磁碟後立即返回寫入成功的響應,但是不等待磁碟寫入完成
2. ACK機制
在 rocketMq 中, producer 傳送訊息後,broker會返回ACK確認訊號,表示訊息已經傳送成功,如果broker 沒有收到確認訊號,就會嘗試重新傳送該訊息,直到訊息被確認為止
rockerMq 採用主動複製機制,每個訊息佇列都有一個主節點和多個從節點,主節點負責訊息的寫入和讀取,從節點負責備份資料,當主節點當機時,從節點會自動接管主節點的工組,確保訊息不會丟失
3. 訊息儲存機制
rocketMq 預設使用雙寫模式來儲存訊息,即將訊息同時寫入記憶體和磁碟中,然後再將記憶體中的訊息非同步刷盤到磁碟中,這種方式可以保證訊息的可靠性,即時系統當機,也能夠儘可能的保證訊息不會丟失
除此之外,rocketmq 還提供了多種機制來保證訊息不丟失,如事務訊息,延遲訊息,順序訊息等
為了確保訊息的可靠性,rocketMq 的傳送訊息的速度可能會受到一定的限制,需要在訊息的可靠性和西能之間進行權衡

2.2 rocket mq 訊息如何儲存

1. rocket 的訊息儲存主要涉及了四個部分, 訊息儲存檔案,訊息索引,檔案組織管理以及資料結構
2. 首先是訊息儲存檔案, rocket 主要使用commitLog 檔案來儲存實際的訊息資料, commitLog 是順序寫的檔案,可大大提高寫入效能
3. 為了快速查詢訊息,rocketmq 使用了consumerQueue 和 indexFile 兩種索引檔案, consumerQueue 是基於Topic和Queue 緯度的索引, 儲存了訊息在commitLog 中的偏移量等資訊, indexFile 則是基於訊息key的索引,方便根據key 來快速查詢訊息
4. rocketMq 採用固定大小的檔案儲存方式,當一個檔案寫滿後,會建立新的檔案繼續寫入,同時會有後臺執行緒定期清理過期或不在使用的檔案,以釋放儲存空間
5. 在儲存訊息時,會使用特定的資料結構來最佳化儲存和讀取效率,例如採用位元組陣列來儲存訊息內容

當一條訊息傳送到rocketMq 時,它首先被順序寫入到commitLog 檔案中,同時相關的索引資訊會被更新到對應的ConsumerQueue 和可能的indexFile 中,
當消費者需要獲取訊息時,先透過consumerQueue 快速定位訊息在commitLog 中的位置,然後從commitLog 中讀取具體的訊息內容, 透過這種方式,rocketMq 能夠保證在高效能寫入的同時,提供高效的訊息查詢和消費功能

2.3 rocket Mq 如何保證訊息順序

1. 生產者將要保證順序的訊息傳送到同一個messageQueue 中,透過特定的路由策略,會將具有順序關聯的訊息路由到同一個佇列
2. messageQueue 中的訊息,是按照傳送的先後順序進行儲存的
3. 消費者在消費指定的messageQueue時,採用單執行緒順序消費的方式,確保同一個messageQueue 中的訊息按照傳送順序被處理

2.4 訊息大量積壓怎麼解決

1. 當訊息出現大量積壓時,首先需要檢查消費者,確認消費者是否正常啟動執行,檢視消費者日誌,是否報錯或者異常,消費邏輯上是否存在緩慢、死迴圈或者其他邏輯問題
2. 對比正常情況下的消費速度和當前的消費速度,是否有明顯的下降,檢查消費者的配置,例如執行緒數、批次消費大小是否合理
3. 檢查生產者的傳送速度是否異常增加,檢視生產者的日誌是否有傳送失敗或者重試記錄
4. 監控 Broker 資源,檢視所在伺服器的cpu、記憶體、網路、磁碟IO等資源的使用情況,是否存在資源瓶頸,檢查broker 的配置,如記憶體,儲存等是否滿足業務需求
5. 確定哪些佇列中的訊息出現了積壓,分析這些佇列對應的主題和業務,是否存在異常的流量模式
6. 

3. rocket 的使用

3.1 rocket 生產者

1. 建立一個common 類, 引入rocket 相關依賴(rocketMq-springboot),
2. 建立 MqProduceService 類, 主要用於統一傳送訊息的格式, 不需要關注mqTemplate
3. 針對需要使用mq 的專案,引入 common-mq 依賴, 同時配置其所需資訊, 如 name-server、producer.group 等
4. 針對需要傳送的訊息,直接呼叫mqProduceService 進行訊息傳送,需要指定其 topic 與 tag , 同時topic 應當與消費者的topic 以及 tag 相同

3.2 rocket消費者

1. 引入 common-mq 依賴,配置name-server 地址
2. 建立一個component 類, 實現RockerMQListener , 重寫 onMessage 方法 ,同時在類上新增 @RocketMQMessageListener 註解,同時指定其topic 以及 consumerGroup 
3. 在配置檔案中, 透過consumer.listeners 來配置對某個消費分組的監聽, 是否監聽指定的topic, 不配置預設監聽

3.3 rocket 事務訊息

1. 

相關文章