文章目录
前言
疫情期间,学习研究了一下《RocketMQ技术内幕》这本书,记录一下自己的学习心得
一、NameServer路由中心
待续
二、消息存储
1.消息发送存储流程
代码如下(示例):
待续
2.存储文件
待续
三、消息消费
1、消息者启动流程
跟踪DefaultMQPushConsumer的启动流程,start()方法
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4");
consumer.setNamesrvAddr("127.0.0.1:9876");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.subscribe("TopicTest", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext context) {
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}
}
DefaultMQPushConsumerImpl#start
1、构建主题订阅信息SubscriptionData并加入RebalanceImpl的订阅消息中。
2、初始化MQClientInstance、RebalanceImpl(消息重新负载实现类)等
3、初始化消息进度。集群模式进度保存在Broker上,广播模式季度存储在消费端。
4、根据是否顺序消费,创建消费端消费线程服务。ConsumeMessageService主要负责消息消费,内部维护一个线程池
5、向MQClientInstance注册消息消费者,并启动MQClientInstance,在一个JVM中的所有消费者、生产者持有同一个MQClientInstance、MQClientInstance只会启动一次
/**
* 消费启动流程
*
* @throws MQClientException
*/
public synchronized void start() throws MQClientException {
switch (this.serviceState) {
case CREATE_JUST:
log.info("the consumer [{}] start beginning. messageModel={}, isUnitMode={}", this.defaultMQPushConsumer.getConsumerGroup(),
this.defaultMQPushConsumer.getMessageModel(), this.defaultMQPushConsumer.isUnitMode());
this.serviceState = ServiceState.START_FAILED;
this.checkConfig();
// 1、构建主题订阅信息SubscriptionData并加入RebalanceImpl的订阅消息中。
this.copySubscription();
// 2、初始化MQClientInstance、RebalanceImpl(消息重新负载实现类)等
if (this.defaultMQPushConsumer.getMessageModel() == MessageModel.CLUSTERING) {
this.defaultMQPushConsumer.changeInstanceNameToPID();
}
this.mQClientFactory = MQClientManager.getInstance().getAndCreateMQClientInstance(this.defaultMQPushConsumer, this.rpcHook);
this.rebalanceImpl.setConsumerGroup(