1、對于Rocketmq消息積壓、丟失如何解決?
消息積壓原因以及解決方案
🎯 產生原因:
消費者處理能力弱,消費速度遠低于生產速度;
網絡不穩定,消費者拉取消息失敗;
消費端異常(如處理邏輯阻塞、宕機);
消費者線程數過少或消費邏輯中存在阻塞操作。
? 解決方案:
方法 說明
- 增加消費者實例數 RocketMQ 是天然支持水平擴展的,多實例消費同一個 Consumer Group 可以分擔壓力、如果消費實例大于隊列Message Queue,就需要擴容Message Queue數量。
- 提高消費線程數 DefaultMQPushConsumer#setConsumeThreadMax(int) 調整線程數,提升并發消費能力
- 異步消費、批量消費 將消費邏輯異步化或開啟批量消費(如一次拉取多條消息)以提升處理效率
- 降低發送速率(限流) 在生產端做速率控制,避免瞬時高并發導致積壓
- 提高消費者異常容錯能力 避免因為單條消息異常導致消費阻塞,如使用 try-catch 包裹消費邏輯并記錄錯誤
- 利用監控預警 RocketMQ 提供消息堆積監控(通過 accumulationCount 指標),及時報警、自動擴容
消息丟失解決方案:
一、預防性原因以及解決方案(防止丟失)
消息丟失的常見原因:
場景 | 可能原因 |
---|---|
生產端丟失 | 消息發送失敗未處理;未等待 Broker 確認 |
Broker 丟失 | 異步刷盤;Broker 崩潰前消息未持久化 |
消費端丟失 | 消費成功但 offset 提交失敗;消費失敗但 offset 提交了 |
解決方案
- 生產者防丟措施:設置請求確認機制、使用同步發送、啟用發送重試設置
setRetryTimesWhenSendFailed()
來保證消息的可靠傳遞 - Broker持久化防丟措施:消息持久化、同步刷盤、使用主從模式。
- 同步刷盤:在消息達到Broker的內存之后,必須刷到commitLog日志文件中才算成功,然后返回Producer數據已經發送成功。
- 異步刷盤:異步刷盤是指消息達到Broker內存后就返回Producer數據已經發送成功,會喚醒一個線程去將數據持久化到CommitLog日志文件中。
- 消費者防丟措施:Consumer保證消息成功消費的關鍵在于確認的時機,不要在收到消息后就立即發送消費確認,而是應該在執行完所有消費業務邏輯之后,再發送消費確認、異常消費時不要返回成功狀態、設置最大重試次數,消費失敗消息自動轉入死信隊列,便于人工補償。
二、補救性解決方案(已丟失處理)
- 消息溯源
生產者日志:消息發送日志落盤 - 補償機制
定時校對:生產消費對賬 - 死信處理
DLQ監控:自動告警+人工處理
面試時候總結的來說:主要通過…機制預防消息丟失,同時設計了…方案應對極端情況下的消息丟失"
2、
一、消息積壓解決方案
3、JVM 常用工具命令大全
一、圖形化工具
- JConsole
啟動命令:
jconsole
功能:
監控堆內存、線程、類加載情況
查看MBean信息
監控CPU使用率
支持遠程連接JMX
2. VisualVM
啟動命令:
jvisualvm
功能:
更強大的性能分析功能
支持插件擴展(如GC插件)
線程轉儲分析
內存采樣和CPU分析
支持快照比
二、命令行工具
- jstat - JVM統計監控工具
常用命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
常用選項:
選項 說明
-class 類加載統計
-gc GC堆狀態
-gccapacity 各區容量
-gcutil GC統計匯總
-gccause 最近GC原因
-gcnew 新生代統計
-gcold 老年代統計
每1秒打印一次GC情況,共打印5次
jstat -gcutil -h5 <pid> 1000 5
帶時間戳輸出
jstat -gc -t <pid> 1000
- jstack - 線程堆棧分析工具
命令格式:
jstack [-l] [-F] <pid>
常用參數:
參數 說明
-l 長列表,打印鎖的附加信息
-F 強制dump(當jstack無響應時使用)
-m 混合模式(Java和Native幀)
# 獲取線程dump并輸出到文件
jstack -l 1234 > thread_dump.txt
# 查找CPU高的線程(配合top命令使用)
top -H -p <pid>
printf "%x\n" <nid> # 將線程ID轉為16進制
jstack <pid> | grep -A 20 <nid_hex>
- jmap - 內存分析工具
命令格式:
bash
jmap [option] <pid>
常用選項:
選項 說明
-heap 顯示堆概要信息
-histo[:live] 顯示堆中對象統計(live表示只統計存活對象)
-dump: 生成堆轉儲快照
-finalizerinfo 顯示等待finalize的對象
示例:
# 生成堆dump文件(生產環境慎用,會STW)
jmap -dump:format=b,file=heap.hprof 1234# 顯示存活對象統計
jmap -histo:live 1234 | head -20
- jinfo - 配置信息工具
命令格式:
bash
jinfo [option] <pid>
常用功能:
# 查看所有系統屬性
jinfo -sysprops <pid># 查看指定JVM參數
jinfo -flag MaxHeapSize <pid># 動態修改部分參數(僅支持可寫的參數)
jinfo -flag +PrintGCDetails <pid>
四、使用技巧
組合使用示例:
# 快速診斷流程
jps -mlvV | grep <app_name> # 找PID
jstat -gcutil <pid> 1000 5 # 看GC
jstack <pid> > thread.txt # 線程分析
jmap -histo:live <pid> | head -20 # 對象統計
生產環境注意事項:
jmap -dump 會導致STW,謹慎使用
優先使用jcmd GC.heap_dump替代jmap
線程dump建議連續做3次(間隔5秒)
使用-F參數時可能造成JVM暫停更久
常用分析流程:
高CPU → top -H → jstack → 16進制線程ID匹配
內存泄漏 → jmap -histo → 分析大對象 → jmap -dump → MAT分析
GC問題 → jstat -gcutil → 分析各分區變化