【雨夜】 RocketMQ 从实践角度 说源码(二)

248 阅读3分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第n篇文章,点击查看活动详情

接上节 上节讲的是 namesrv 的NamesrvController 初始化,这节 写 KVConfigManager RouteInfoManager

带着问题 往下看 (namesrv)

  1. 如果消息 接收有异常,在哪看?
  2. 如果消息消费 有异常,我希望 接入我们公司的消息通知系统,怎么做?
  3. 发送消息的时候 '消费者不在线' code 码是多少
  4. 明明设置了 autoCreateTopicEnable = true 但是 业务端发送消息 发现topic 没有创建
  5. 如果感觉 参数/请求头 key过大,希望 压缩 怎么办
  6. 默认的topicConfigTable 有什么?
  7. 我现在临时想看下 topic 在broker上有哪些,暂时没有console 怎么看

请先自己 想想,把答案写出来,然后往下看

nameserver 问题解答

如果消息 接收有异常,在哪看?

主要看 MessageTrack 类

public class MessageTrack {//如果 消息接收有异常 怎么确定问题
    private String consumerGroup;//消费者组
    private TrackType trackType;//链路类型
    private String exceptionDesc;//错误信息
}

如果消息消费 有异常,我希望 接入我们公司的消息通知系统,怎么做?

发送消息的时候 '消费者不在线' code 码是多少

public static final int CONSUMER_NOT_ONLINE = 206;//消费者不在线

明明设置了 autoCreateTopicEnable = true 但是 业务端发送消息 发现topic 没有创建

Producer发送一个不存在的Topic消息时,首先会从NameServer拉取Topic路由数据,第一次拉取必然失败,第二次会直接拉取TBW102的路由数据,基于它创建TopicPublishInfo并缓存到本地,进行正常的消息发送,在Header里将defaultTopic设置为TBW102。Broker接收到消息时,先对消息做Check,检查到Topic不存在,会基于defaultTopic的配置去创建该Topic,然后注册到NameServer上,这样一个全新的Topic就被自动创建了。

可能是 nameServer 拉取 失败 或者 broker 创建Topic 失败,需要一个一个 确定问题。 一般都是 broker的事 ,但是那次broker 一切正常,logs 也无报错,但是发现没有消息。只能往前找,发现是 nameServer 拉取TBW102 有问题

如果感觉 参数/请求头 key过大,希望 压缩 怎么办

把key 变为 a b c d 减少传输的key

SendMessageRequestHeaderV2 requestHeaderV2 = SendMessageRequestHeaderV2.createSendMessageRequestHeaderV2(requestHeader);

默认的topicConfigTable 有什么?

image.png

我现在临时想看下 topic 在broker上有哪些,暂时没有console 怎么看

两部分 其中第一部分是 本地,代码在TopicConfigManager 类 createTopicInSendMessageMethod 方法 D:/gitWorkspace/rocketmq/data\config\topics.json 把topic的信息 都变为了 json 进行存储

json 实际就是 broker中 topicConfigTable 这个map的信息

另外一部分是 远程topic 信息同步,最底层调用的方法为 BrokerOuterAPI 类 registerBrokerAll方法

再根据 rocketmq-console-ng 2.0.0 中 访问topic列表的 接口 http://localhost:8080/topic/list.query 查看其源码 进行 验证 底层调用的是 MQClientAPIImpl 类的 getTopicListFromNameServer 方法 调用的 是 rocket-client 的 206 code 获取 topicList, 是从 nameserver 处 获取 下面map的 keySet

HashMap<String/* topic */, List<QueueData>> topicQueueTable;

总结

这些 只是 namestr 的NamesrvController 初始化,之后 慢慢的一点点往下写,如果感觉写的还有优化的,评论下 哈

wx yuyezhiji 雨夜