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 → 分析各分区变化