RocketMQ之 Producer

producer 发送流程producer 在消息发送时,肯定要先知道 topic 的信息,以及 topic 在哪个 broker 上,那么 producer 是如何做的呢?还记得在 01 开篇说的吗? namesrv 提供一个通过 topic 获取路由信息的接口(RouteInfoManager#pickupTopicRouteData). producer 就是根据该接口返回的 TopicRouteData, 知道要将 topic 发送至哪个 broker.TopicRouteDatapriva
摘要由CSDN通过智能技术生成

producer 发送流程

producer 在消息发送时,肯定要先知道 topic 的信息,以及 topic 在哪个 broker 上,那么 producer 是如何做的呢?

还记得在 01 开篇说的吗? namesrv 提供一个通过 topic 获取路由信息的接口(RouteInfoManager#pickupTopicRouteData). producer 就是根据该接口返回的 TopicRouteData, 知道要将 topic 发送至哪个 broker.

TopicRouteData

private String orderTopicConf;
private List<QueueData> queueDatas;
private List<BrokerData> brokerDatas;
private HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

从返回的结构来看,知道了 broker 地址,还有 topic 下有哪些队列,接下来就可以发消息了。

producer 获取了 topic 的信息,会将这些信息封装为另外一个数据结构

class TopicPublishInfo {
   
    ...
    private List<MessageQueue> messageQueueList = new ArrayList<MessageQueue>();
    private volatile ThreadLocalIndex sendWhichQueue = new ThreadLocalIndex();
    ... 
}

class MessageQueue {
   
    private String topic;
    private String brokerName;
    private int queueId;
}

messageQueueList 大概长这样子

[
    {
   
        "brokerName":"broker-a",
        "queueId":0,
        "topic":"TBW102%zouLeTopic"
    },
    {
   
        "brokerName":"broker-a",
        "queueId":1,
        "topic":"TBW102%zouLeTopic"
    },
    {
   
        "brokerName":"broker-a",
        "queueId":2,
        "topic":"TBW102%zouLeTopic"
    },
    {
   
        "brokerName":"broker-a",
        "queueId":3,
        "topic":"TBW102%zouLeTopic"
    },
    {
   
        "brokerName":"broker-b",
        "queueId":0,
        "topic":"TBW102%zouLeTopic"
    },
    {
   
        "brokerName":"broker-b",
        "queueId":1,
        "topic":"TBW102%zouLeTopic"
    },
    {
   
        "brokerName":"broker-b",
        "queueId":2,
        "topic":"TBW102%zouLeTopic"
    },
    {
   
        "brokerName":"broker-b",
        "queueId":3,
        "topic":"TBW102%zouLeTopic"
    }
]

可以看到,上面的 topic TBW102%zouLeTopicbroker-b, broker-a 都存在

我们知道了 topic 可以有很多队列,那么 producer 在发消息时,如何选择哪个队列发送呢?

答案是 从 messageQueueList 中轮询选择一个队列进行发送(每个线程,都有自己的计数器)。

TopicPublishInfo#selectOneMessageQueue(final String lastBrokerName)

public MessageQueue selectOneMessageQueue(final String lastBrokerName) {
   
    if (lastBrokerName == null) {
   
        // 大部分情况走这个函数
        return selectOneMessageQueue
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值