「日拱一卒」带你探索RocketMQ消息发送(八)

81 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

前言

上一篇文章「日拱一卒」带你探索RocketMQ消息发送(七),我们一起学习了 RocketMQ 选择消息发送队列的机制,选择了合适的队列后,就可以进行消息的发送了。今天我们一起来探索消息发送的源码吧~

同步发送

RocketMQ Client 发送消息的方法是 MQClientAPIImpl#sendMessage ,当 communicationMode = SYNC 时,会调用 MQClientAPIImpl#sendMessageSync 方法进行发送:

image.png

invokeSync 方法中,有 Netty 相关的逻辑,这里有一个监听器,channel 将消息发送给对应的 Server 处理后,会监听 Server 返回的结果:

image.png

接下来,再看看服务端是怎么处理同步消息的,处理的主要逻辑在 org.apache.rocketmq.broker.processor.AbstractSendMessageProcessor#msgCheck 方法中,该方法主要的做了以下的事情:

  1. 检测 Broker 是否有写权限 image.png

  2. 校验 Topic 是否可以进行消息发送;主要是针对默认主题,默认主题不能发送消息,仅供路由查找 image.png

    image.png

  3. 在 NameServer 端存储 Topic 端配置信息,主要🈶️

    • order:是否是顺序消息
    • perm:权限码
    • readQueueNums:读队列数量
    • writeQueueNums:写队列数量
    • topicName:Topic 名称
    • topicSysFlag:Topic Flag 当前版本暂为保留
    • topicFilterType:Topic 过滤方式,当前版本支持 Single Tag image.png
  4. 检测队列,若队列不合法,则返回错误码

    image.png

  5. 如果消息重试次数超过允许的最大重试次数,消息将进入DLQ死信队列。死信队列的 Topic 为 %DLQ% + 消费组名

  6. 调用 DefaultMessageStore#putMessage 进行消息存储。

异步发送、单向发送、批量发送的核心逻辑与同步发送的类似,代码分析就不在这里一一展开了,有兴趣的同学们自行阅读~

总结

一共八篇文章, 带大家一起学习了 RocketMQ 消息发送的代码,希望大家有所收获~