RocketMQ原理解析-producer 2.如何发送消息

Producer轮询某topic下的所有队列的方式来实现发送方的负载均衡



1)  Topic下的所有队列如何理解:

比如broker1, broker2, borker3三台broker机器都配置了Topic_A

Broker1 的队列为queue0 , queue1

Broker2 的队列为queue0, queue2, queue3,

Broker3 的队列为queue0

当然一般情况下的broker的配置都是一样的

以上当broker启动的时候注册到namesrv的Topic_A队列为共6个分别为:

broker1_queue0, broker1_queue1,

broker2_queue0, broker2_queue1, broker2_queue2,

broker3_queue0,

2)  Producer如何实现轮询队列:

Producer从namesrv获取的到Topic_A路由信息TopicPublishInfo

           --List<MessageQueue>messageQueueList  //Topic_A的所有的队列

           --AtomicIntegersendWhichQueue        //自增整型

           方法selectOneMessageQueue方法用来选择一个发送队列

                    (++sendWitchQueue)% messageQueueList.size为队列集合的下标

                    每次获取queue都会通过sendWhichQueue加一来实现对所有queue的轮询

                            如果入参lastBrokerName不为空,代表上次选择的queue发送失败,这次选择应该避开同一个queue

3)  Producer发消息系统重试:

发送失败后,重试几次retryTimesWhenSendFailed = 2

发送消息超时sendMsgTimeout = 3000

Producer通过selectOneMessageQueue方法获取一个MessagQueue对象

           --topic            //Topic_A

           --brokerName           //代表发送消息到达的broker

           --queueId              //代表发送消息的在指定broker上指定topic下的队列编号

向指定broker的指定topic的指定queue发送消息

                   发送失败(1)重试次数不到两次(2)发送此条消息花费时间还没有到3000(毫秒), 换个队列继续发送。


 producer发送普通消息




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值