1. 程式人生 > >RocketMQ原理解析-producer 2.如何傳送訊息

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傳送普通訊息