匠心零度 轉載請註明原創出處,謝謝!
RocketMQ網路部署圖
- NameServer:在系統中是做命名服務,更新和發現 broker服務。
- Broker-Master:broker 訊息主機伺服器。
- Broker-Slave: broker 訊息從機伺服器。
- Producer: 訊息生產者。
- Consumer: 訊息消費者。
說明: rocketmq系列都將會以rocketmq-4.1.0-incubating進行介紹。
在閱讀原始碼時做了一定的註釋,公眾號【匠心零度】回覆:rocketmq,可獲得基於rocketmq4.1.0加詳細中文程式碼註釋 。歡迎大家 star、fork !
上篇RocketMQ(八):訊息傳送主要分析了下一般傳送流程,本篇將會介紹下定時傳送,順序傳送,批量傳送等情況 。
訊息傳送概述
上面的圖大概就是producer傳送message到broker的核心邏輯了。
備註: 本篇將會介紹下定時傳送,順序傳送,批量傳送情況 ,這些情況說明都是站在producer角度進行說明,涉及到broker的內容會在分析broker相關內容的時候進行分析。
定時傳送
何為定時訊息
Producer 將訊息傳送到 MQ 服務端,但並不期望這條訊息立馬投遞,而是延遲一定時間後才投遞到 Consumer 進行消費。
呼叫形式
與普通的呼叫傳送基本沒有什麼區別,唯一就是多了一個訊息設定setDelayTimeLevel即可。程式碼呼叫如圖:
那麼這裡的級別應該填寫什麼呢?對應什麼呢?—>這塊後續會分析,今天這裡簡單說明下:
其他的就和普通傳送沒有任何區別了,關鍵處理在broker,後續分析。
順序傳送
何為順序傳送
參考:https://help.aliyun.com/document_detail/49319.html?spm=a2c4g.11186623.2.3.21aKRd
呼叫形式
我們來看看具體內容實現呼叫就明白怎麼回事了:
-
獲取到所有可傳送的資訊
-
傳送內容
-
用來區分(比如訂單號,這一類的訂單號是有順序的,但是和其他訂單號可以無序)
sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Integer id = (Integer) arg;
int index = id % mqs.size();
return mqs.get(index);
}
}, orderId);
複製程式碼
這裡mqs就是獲取到所有可傳送的資訊,而orderId就是用來區分的,每次拿這個orderId和所有的進行取模(如果所有的沒有變化的情況下面)那麼一種都是固定的那個佇列了(佇列就是先進先出了),後續消費在分析消費如何處理這塊。
**備註:**這裡的順序也是相對的,如果新增了broker或者broker減少了,那麼取模的資訊勢必會不一致,所以需要明白下。
批量傳送
何為批量傳送
批量這個概念我相信大家一定都非常熟悉了,在很多調優的時候,比如資料庫批量處理,有些請求進行合併傳送等都是類似實現,那麼rocketmq批量傳送也是為了追求效能,特別在數量量級特別大的時候,批量效果就非常明顯了。
**備註:**既然是批量就是等一批之後傳送,那麼實時性一定可能就稍微有點點延遲了(可以忽略,特別資料量多的情況)。我一般處理批量的就2個維度,達到一個就可以觸發,1.達到給定條數 2.達到給定時間(比如3s一次,如果這個時候資料量還是不夠也會進行傳送)……
rocketmq只是提供介面,傳送一批資料,那麼何時傳送這一批資料就是根據自己的選擇,就是上面說的兩條就是一般的做法:
- 達到給定條數 。
- 達到給定時間。
呼叫形式
rocketmq這裡有一個好處,就是在批量傳送的時候,會做一個簡單的轉換,減少網路傳輸,學習下:
把這些轉化為a、b、c等形式。
我們來看看rocketmq給我們的批量傳送的例子,為什麼會給我們2個例子呢?需要思考!!!,下面我會來為大家講解下:
備註: 批量傳送需要相同的topic以及相同的waitStoreMsgOK 和不支援定時傳送。
Messages of the same batch should have: same topic, same waitStoreMsgOK and no schedule support。
這種傳送就是批量(這裡的批量不是特別大),就自己傳送走了。
這裡的批量(批量的資料太多),所以進行分割之後傳送了。最後呼叫的方法還是一樣的。
我們知道目前rocketmq預設支援4M傳送訊息內容(不管是一條還是批量),假如需要調整也可以調整,那麼會一直沒有上限嗎?還有很多人說調整了10M為什麼沒有生效(這裡是需要Producer和服務端broker都調整才行,後續說明解釋,還有由於是基於netty網路傳輸,可能你需要看看RocketMQ(二):RPC通訊,這裡進行了說明)
這裡決定了最大最大隻能是16M,如果需要就需要修改了,一般也不建議修改,就和批量傳送的第二個方式一樣就行,進行拆開批量傳送就是了。
如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【匠心零度】,查閱更多精彩歷史!!!
加入知識星球,一起探討!