开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
前言
上一篇文章「日拱一卒」带你探索RocketMQ消息发送(七),我们一起学习了 RocketMQ 选择消息发送队列的机制,选择了合适的队列后,就可以进行消息的发送了。今天我们一起来探索消息发送的源码吧~
同步发送
RocketMQ Client 发送消息的方法是 MQClientAPIImpl#sendMessage ,当 communicationMode = SYNC 时,会调用 MQClientAPIImpl#sendMessageSync 方法进行发送:
invokeSync 方法中,有 Netty 相关的逻辑,这里有一个监听器,channel 将消息发送给对应的 Server 处理后,会监听 Server 返回的结果:
接下来,再看看服务端是怎么处理同步消息的,处理的主要逻辑在 org.apache.rocketmq.broker.processor.AbstractSendMessageProcessor#msgCheck 方法中,该方法主要的做了以下的事情:
-
检测 Broker 是否有写权限
-
校验 Topic 是否可以进行消息发送;主要是针对默认主题,默认主题不能发送消息,仅供路由查找
-
在 NameServer 端存储 Topic 端配置信息,主要🈶️
- order:是否是顺序消息
- perm:权限码
- readQueueNums:读队列数量
- writeQueueNums:写队列数量
- topicName:Topic 名称
- topicSysFlag:Topic Flag 当前版本暂为保留
- topicFilterType:Topic 过滤方式,当前版本支持 Single Tag
-
检测队列,若队列不合法,则返回错误码
-
如果消息重试次数超过允许的最大重试次数,消息将进入DLQ死信队列。死信队列的 Topic 为 %DLQ% + 消费组名
-
调用 DefaultMessageStore#putMessage 进行消息存储。
异步发送、单向发送、批量发送的核心逻辑与同步发送的类似,代码分析就不在这里一一展开了,有兴趣的同学们自行阅读~
总结
一共八篇文章, 带大家一起学习了 RocketMQ 消息发送的代码,希望大家有所收获~