rocketmq源码分析


前言

疫情期间,学习研究了一下《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(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值