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