当前位置: 首页 > news >正文

面试实践AND面经热点题目总结

1、对于Rocketmq消息积压、丢失如何解决?

消息积压原因以及解决方案
🎯 产生原因:
消费者处理能力弱,消费速度远低于生产速度;

网络不稳定,消费者拉取消息失败;

消费端异常(如处理逻辑阻塞、宕机);

消费者线程数过少或消费逻辑中存在阻塞操作。

✅ 解决方案:
方法 说明

  1. 增加消费者实例数 RocketMQ 是天然支持水平扩展的,多实例消费同一个 Consumer Group 可以分担压力、如果消费实例大于队列Message Queue,就需要扩容Message Queue数量。
  2. 提高消费线程数 DefaultMQPushConsumer#setConsumeThreadMax(int) 调整线程数,提升并发消费能力
  3. 异步消费、批量消费 将消费逻辑异步化或开启批量消费(如一次拉取多条消息)以提升处理效率
  4. 降低发送速率(限流) 在生产端做速率控制,避免瞬时高并发导致积压
  5. 提高消费者异常容错能力 避免因为单条消息异常导致消费阻塞,如使用 try-catch 包裹消费逻辑并记录错误
  6. 利用监控预警 RocketMQ 提供消息堆积监控(通过 accumulationCount 指标),及时报警、自动扩容

消息丢失解决方案:
一、预防性原因以及解决方案(防止丢失)

消息丢失的常见原因:

场景可能原因
生产端丢失消息发送失败未处理;未等待 Broker 确认
Broker 丢失异步刷盘;Broker 崩溃前消息未持久化
消费端丢失消费成功但 offset 提交失败;消费失败但 offset 提交了

解决方案

  1. 生产者防丢措施:设置请求确认机制、使用同步发送、启用发送重试设置 setRetryTimesWhenSendFailed()来保证消息的可靠传递
  2. Broker持久化防丢措施:消息持久化、同步刷盘、使用主从模式。
    • 同步刷盘:在消息达到Broker的内存之后,必须刷到commitLog日志文件中才算成功,然后返回Producer数据已经发送成功。
    • 异步刷盘:异步刷盘是指消息达到Broker内存后就返回Producer数据已经发送成功,会唤醒一个线程去将数据持久化到CommitLog日志文件中。
  3. 消费者防丢措施:Consumer保证消息成功消费的关键在于确认的时机,不要在收到消息后就立即发送消费确认,而是应该在执行完所有消费业务逻辑之后,再发送消费确认、异常消费时不要返回成功状态、设置最大重试次数,消费失败消息自动转入死信队列,便于人工补偿。

二、补救性解决方案(已丢失处理)

  1. 消息溯源
    生产者日志:消息发送日志落盘
  2. 补偿机制
    定时校对:生产消费对账
  3. 死信处理
    DLQ监控:自动告警+人工处理
    面试时候总结的来说:主要通过…机制预防消息丢失,同时设计了…方案应对极端情况下的消息丢失"

2、

一、消息积压解决方案

3、JVM 常用工具命令大全

一、图形化工具

  1. JConsole
    启动命令:
jconsole

功能:
监控堆内存、线程、类加载情况
查看MBean信息
监控CPU使用率
支持远程连接JMX
2. VisualVM
启动命令:

jvisualvm

功能:
更强大的性能分析功能
支持插件扩展(如GC插件)
线程转储分析
内存采样和CPU分析
支持快照比

二、命令行工具

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

相关文章:

  • 探索 C++23 的 views::cartesian_product
  • 基于机器学习的攻击检测与缓解,以及 SDN 环境中的多控制器布局优化
  • 微程序控制器的详细工作过程
  • 如何在Jmeter中调用C程序?
  • 深入理解Embedding Models(嵌入模型):从原理到实战(上)
  • 2025-05-08 Unity 网络基础9——FTP通信
  • 学习笔记:数据库——事务
  • 克里金模型+多目标优化+多属性决策!Kriging+NSGAII+熵权TOPSIS!
  • 使用Jmeter对AI模型服务进行压力测试
  • Matlab 四分之一车体被动和模糊控制对比
  • MySQL报错解决过程
  • MySQL 8.0 OCP 英文题库解析(一)
  • Python 爬虫之 XPath 元素定位
  • 【Linux】swap交换分区管理
  • 【ArcGIS微课1000例】0146:将多个文件夹下的影像移动到一个目标文件夹(以Landscan数据为例)
  • 一文读懂Python之requests模块(36)
  • 精品,架构师总结,MySQL 5.7 查询入门详解
  • 【Rust】结构体
  • 云原生安全治理体系建设全解:挑战、框架与落地路径
  • python线上学习进度报告
  • 商务部再回应中美经贸高层会谈
  • 夜读丨母亲的手擀面
  • 外交部发言人就当前印巴局势答记者问
  • 鸿蒙概念股强势上涨,鸿蒙电脑本月正式发布,生态链即将补全
  • “鱼米之乡”江苏兴化的产业哲学:以融合与创新重构价值链条
  • 贵州黔西游船倾覆事故70名落水人员在院救治,均为轻伤