“你了解RocketMQ源码和实践吗?”
—— 面试官不经意地问。
“哎呀,我刚学Java,RocketMQ听起来好高大上啊……”我挠着头。
然而,这一挠,挠出了面试官一脸疑惑,也挠出了我表演的开场白……
面试场景描写
地点:北京国贸,科技公司25层会议室
时间:一个阳光明媚的上午
人物描写:
面试官——王工,约35岁,架着黑框眼镜,西装笔挺,眉头紧皱,像刚被数据库锁给整破防了。
我——奇哥,技术圈传说中的“半仙”,此刻装作一脸天真,穿着基础款程序员T恤,背着小米双肩包,眼神中透露着“我是谁我在哪”的懵懂。
面试对白开局
王工推了推眼镜:“你对RocketMQ了解吗?源码读过没有?实践玩过没?”
我挠头嘿嘿一笑:“Rocket……火箭?是不是跟发射器有关系?源码我看过一点点,写个消息生产者应该差不多吧?”
王工皱起眉头,语气中透出点“别浪费我时间”的味道:“那你来说说,Broker启动流程你知道不?”
我猛地坐正,目光突然变得犀利,像开了Buff:“王工,其实我偷偷研究了几个月,就等你问这个了。”
一、RocketMQ架构概览
RocketMQ核心组件有四个:
- Producer(消息生产者):发送消息;
- Broker(消息中间人):消息的转运中心;
- Consumer(消息消费者):接收消息;
- NameServer(注册中心):维持路由信息。
这像不像餐厅点餐:Producer是点单的顾客,Broker是厨师,Consumer是吃货,NameServer就是前台小妹,告诉你哪位厨师还没辞职。
二、Broker启动源码简析
源码主入口:
public static void main(String[] args) {
start(createBrokerController(args));
}
Broker启动流程:
- 加载配置文件
- 初始化核心组件(Netty、消息存储等)
- 注册到NameServer
- 启动监听端口,等待生产者发送消息
经典类:BrokerStartup.java
、BrokerController.java
三、Producer发送流程源码
Producer的发送核心逻辑:
- 获取Topic路由信息(从NameServer)
- 选择队列(MessageQueue)
- 使用Netty发送消息到Broker
- 等待ACK确认
SendResult sendResult = producer.send(message);
背后的类包括:
DefaultMQProducer
MQClientInstance
NettyRemotingClient
四、Consumer消费流程
消费者核心:
- Push模式:注册监听器,消息来了就触发回调
- Pull模式:主动拉取消息
关键类:
DefaultMQPushConsumer
ConsumeMessageConcurrentlyService
五、实践应用技巧
-
事务消息
RocketMQ支持分布式事务,是金融级场景的宝藏。 -
延迟消息
可配置延迟等级,实现订单15分钟未支付自动取消。 -
消息重试与死信队列
自动重试,失败进入死信队列,业务不会被消息“拖死”。
面试结局吊打收尾
我娓娓道来,从Broker源码到消息发送细节,再谈到项目实战中如何解决消息重复投递与消费幂等性问题。
王工脸色从“你在逗我玩”逐渐变成“你小子是扮猪吃老虎”。
最终他摘下眼镜叹气说:“你到底是小白,还是RocketMQ亲儿子?”
我摊手一笑:“RocketMQ是我精神上的干爹。”
总结
有时候,技术不是用来炫耀的,而是藏在不经意之间,等你需要它时,它就如利剑出鞘,锋芒毕露。
愿你我都有一把属于自己的技术利刃。
编写:奇哥
时间:2025年7月
本文已同步发布于微信公众号与CSDN专栏。