Netty 通信层源码剖析
RocketMQ 的底层通信完全基于 Netty 实现。整体架构Broker 端Netty 服务器负责与客户端的连接请求处理Producer/Consumer 端Netty 客户端负责与 Broker 的通信及请求响应处理Netty 多线程模型RocketMQ 在 Netty 基础之上采用了多线程分离设计将 I/O 线程和业务处理线程分开。核心类类 职责NettyRemotingServer 服务端实现底层基于 ServerBootstrapNettyRemotingClient 客户端实现NettyServerConfig / NettyClientConfig 通信配置连接感知Broker 通过 Netty 的 ChannelInboundHandlerAdapter#channelInactive() 可以实时感知到 Consumer/Producer 的下线。这为 Rebalance 和故障剔除提供了基础。消息过滤源码剖析RocketMQ 支持两种消息过滤方式Tag 过滤和 SQL92 过滤。Tag 过滤根据消息的 Tag 进行过滤性能极高在 ConsumeQueue 中存储了 Tag 的哈希码8 字节过滤时只需比对哈希值一条消息只能有一个 Tag这是它的主要限制SQL92 过滤使用 SQL92 语法作为过滤规则表达式可以过滤消息的属性和 Tag在 SQL 语法中Tag 的属性名称为 TAGS比 Tag 过滤更灵活但性能开销更大需要设置 Broker 配置项 enablePropertyFiltertrue默认为 false两种过滤方式的对比对比维度 Tag 过滤 SQL92 过滤过滤依据 Tag 字符串 用户自定义属性 Tag性能 极高哈希比对 较低解析 SQL 遍历属性灵活性 低只能一个 Tag 高复杂条件组合Broker 配置 默认开启 需 enablePropertyFiltertrue过滤表达式类型在源码中定义为 ExpressionType.TAG 和 ExpressionType.SQL92。SQL92 表达式需要先编译检查合法性再使用编译后的表达式进行计算。源码阅读实战建议读完上面这些模块的源码剖析你可能跃跃欲试了。这里给你几个实战建议搭建源码调试环境从 GitHub 克隆 RocketMQ 源码用 IDEA 导入 Maven 项目先启动 NamesrvStartup再启动 BrokerStartup运行 example 模块中的示例代码进行调试2. 阅读顺序建议阶段 模块 目的第一阶段 remoting 理解网络通信基础第二阶段 namesrv 理解路由注册与发现第三阶段 store 理解存储核心CommitLog ConsumeQueue第四阶段 broker 理解服务端业务逻辑第五阶段 client 理解生产者和消费者3. 调试断点建议Producer 发送DefaultMQProducerImpl#sendDefaultImplConsumer 拉取PullMessageService#runBroker 写入CommitLog#putMessageBroker 拉取PullMessageProcessor#processRequestRebalanceRebalanceService#doRebalance4. 善用日志RocketMQ 的日志非常详细在 ~/logs/rocketmqlogs/ 目录下broker.logBroker 运行日志namesrv.logNameServer 日志store.log存储相关日志rocketmq_client.log客户端日志小结这篇文章我们完整走了一遍 RocketMQ 源码的“地图”通过 8 张流程图 代码片段搞清楚了源码工程结构各模块的职责划分从哪里入手NameServer路由管理的 5 个核心数据结构、心跳注册流程Broker分层架构、启动流程、存储设计理念消息发送4 个核心步骤、Producer 启动流程、定时任务机制消息拉取与消费Push 消费者启动、长轮询的本质CommitLog 写入MappedFile 机制、锁策略、刷盘实现ConsumeQueue 构建ReputMessageService 的“消息重放”机制Rebalance触发入口、分配策略、广播与集群模式的区别事务消息半消息存储、回查机制的完整流程消息重试与死信16 次重试、指数退避、DLQ 处理Netty 通信层多线程模型、连接感知消息过滤Tag 与 SQL92 的原理与对比恭喜你 从入门认知到架构原理从存储机制到发送消费从进阶特性到部署运维再到今天的源码深入——你已经完整走过了 RocketMQ 学习的全过程。你现在已经是一名真正意义上的 RocketMQ 专家了。源码阅读是一个长期的过程不要指望一次性全部读懂。建议你带着问题去读——遇到生产环境的故障时顺着调用栈去追源码想优化性能时去读相关模块的实现。带着目的读源码事半功倍。祝你在 RocketMQ 的进阶之路上越走越远系列文章入门认知篇 ✅核心概念与架构篇 ✅存储与原理篇上✅存储与原理篇中✅存储与原理篇下✅事务消息 ✅进阶应用篇 ✅部署与运维篇 ✅源码深入篇 ✅本文整合实战篇 待续…