rocketmq生产者发送到哪个队列

本文探讨了RocketMQ中生产者如何通过ThreadLocal和随机算法选择消息队列,重点讲解了sendKernelImpl方法、Netty通信原理及TopicPublishInfo的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C-DefaultMQProducer
C-DefaultMQProducerImpl method(sendDefaultImpl-sendKernelImpl-)
M-sendKernelImpl
C-MQClientInstance
-MQClientAPIImpl-M(sendMessage-) 构建-RemotingCommand(1.构建请求头 2.填充消息体)
-NettyRemotingClient
-NettyRemotingAbstract-M(invokeSyncImpl);最终发送消息抽象类.组装 RemotingCommand-)

1.找路由,Producer从namesrv获取的到Topic_A路由信息TopicPublishInfo

2.找队列,随机算法

RocketMQ(六)发消息的时候选择queue的算法有哪些? - 苏先生139 - 博客园

3.发消息,NettyRemotingClient NettyRemotingAbstract 通讯原理netty发送

RocketMQ原理解析-producer 2.如何发送消息_斩秋的专栏-优快云博客_rocketmq发送消息原理

RocketMQ原理学习---生产者普通消息发送_井底之蛙-优快云博客

第一次发消息,topictable缓存无 TopicPublishInfo 信息,此时客户端要与nameServer交互获取topic对应broker信息,至此知道了发送到哪个broker

TopicPublishInfo 信息

 

ThreadLocalIndex

最终的选择队列算法,random.nextInt(),算一个随机数,用随机数对队列总和取余

ThreadLocal在这里啥意思?随机数,线程隔离

自己测试每次创建producer都是不同线程,每次都是生产新的随机数,显然这样算法不好,实际场景应该是一个生产者线程,或者比较少,取出之前值加1,取到下一个队列。生产者到底几个线程?

public class ThreadLocalIndex {
    private final ThreadLocal<Integer> threadLocalIndex = new ThreadLocal<Integer>();
    private final Random random = new Random();

    public int incrementAndGet() {
        Integer index = this.threadLocalIndex.get();
        if (null == index) {
            index = Math.abs(random.nextInt());
            this.threadLocalIndex.set(index);
        }

        this.threadLocalIndex.set(++index);
        return Math.abs(index);
    }

    @Override
    public String toString() {
        return "ThreadLocalIndex{" +
            "threadLocalIndex=" + threadLocalIndex.get() +
            '}';
    }
}
    public MessageQueue selectOneMessageQueue() {
        int index = this.sendWhichQueue.incrementAndGet();
        int pos = Math.abs(index) % this.messageQueueList.size();
        if (pos < 0)
            pos = 0;
        return this.messageQueueList.get(pos);
    }

最终发送消息的抽象类

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值