broker读写权限控制
本质:Topic权限变更,变更broker的topic的配置信息并同步更新namesrv的Topic的Queue信息。
1、mqadmin->defaultMQAdminExt.createAndUpdateTopicConfig(更新指定broker地址的topic的配置信息)
2、broker->updateAndCreateTopic(保存Topic的配置信息到broker,向nameserver注册最新的topic信息)
3、namesrv-> registerBroker(注册broker信息 注册topic配置信息)
broker主题批量迁移
场景:在同一个集群中,brokerA、brokerB 有 topicA的消息,现在想topicA 消息迁移到brokerC上。
实现:把brokerA的TopicA写权限禁掉之后,新增TopicA到brokerC(3天后会自动将brokerA上面的数据清理掉)
消费者治理,解决当前消费者空置、泛滥问题
场景:消费者组客户端监控;超出3天消费者组客户端未上线, 清除消费者组
实现:
(1)查看是否在线(ConsumerConnectionSubCommand):
this.mqClientInstance.getMQClientAPIImpl().getConsumerConnectionList(addr, consumerGroup, timeoutMillis);
如果result.getConnectionSet().isEmpty() 则认为 CONSUMER_NOT_ONLINE
(2)清除消费者组 (DeleteSubscriptionGroupCommand)
删除集群中的broker订阅组 deleteSubscriptionGroup(addr, groupName, removeOffset) 是否需要重置消费进度;
删除nameServer中的重试、死信队列 topic配置信息。
定期清除废弃topic
接口分析:
DefaultMessageStore.cleanUnusedTopic(Settopics)方法对未使用的topic数据进行清理。
源码底层分析:
1、请求参数topics集合取至TopicConfigManager.topicConfigTable列表的key值集合;由Broker的心跳检测功能来维护该topicConfigTable列表的数据,该列表数据对应的是topics.json文件中的数据;
2、遍历DefaultMessageStore.consumeQueueTable集合,若该集合中的某个topic在topicConfigTable列表已经找不到了,则在consumeQueueTable集合中删除该topic对应的记录;以及该topic目录下面的所有物理文件;然后以该topic和该topic目录下面所有队列ID组成的"topic-queueid"为key值删除CommitLog.topicQueueTable集合中对应的记录。
重试主题统一路由到单独broker管理
实现:消费者重试
org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService#submitConsumeRequest#processConsumeResult
-> sendMessageBack消费失败之后的回调org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl#sendMessageBack
重写sendMessageBack方法:给定固定的一个 brokerName