RocketMQ(九):訊息傳送(續)

匠心零度發表於2019-03-04

匠心零度 轉載請註明原創出處,謝謝!

RocketMQ網路部署圖

RocketMQ(九):訊息傳送(續)
  • NameServer:在系統中是做命名服務,更新和發現 broker服務。
  • Broker-Master:broker 訊息主機伺服器。
  • Broker-Slave: broker 訊息從機伺服器。
  • Producer: 訊息生產者。
  • Consumer: 訊息消費者。

說明: rocketmq系列都將會以rocketmq-4.1.0-incubating進行介紹。

在閱讀原始碼時做了一定的註釋,公眾號【匠心零度】回覆:rocketmq,可獲得基於rocketmq4.1.0加詳細中文程式碼註釋 。歡迎大家 star、fork !

上篇RocketMQ(八):訊息傳送主要分析了下一般傳送流程,本篇將會介紹下定時傳送,順序傳送,批量傳送等情況 。

訊息傳送概述

RocketMQ(九):訊息傳送(續)

上面的圖大概就是producer傳送message到broker的核心邏輯了。

備註: 本篇將會介紹下定時傳送,順序傳送,批量傳送情況 ,這些情況說明都是站在producer角度進行說明,涉及到broker的內容會在分析broker相關內容的時候進行分析。

定時傳送

何為定時訊息

Producer 將訊息傳送到 MQ 服務端,但並不期望這條訊息立馬投遞,而是延遲一定時間後才投遞到 Consumer 進行消費。

呼叫形式

與普通的呼叫傳送基本沒有什麼區別,唯一就是多了一個訊息設定setDelayTimeLevel即可。程式碼呼叫如圖:

RocketMQ(九):訊息傳送(續)

那麼這裡的級別應該填寫什麼呢?對應什麼呢?—>這塊後續會分析,今天這裡簡單說明下:

RocketMQ(九):訊息傳送(續)

其他的就和普通傳送沒有任何區別了,關鍵處理在broker,後續分析。

順序傳送

何為順序傳送

參考:https://help.aliyun.com/document_detail/49319.html?spm=a2c4g.11186623.2.3.21aKRd

RocketMQ(九):訊息傳送(續)
呼叫形式
RocketMQ(九):訊息傳送(續)

我們來看看具體內容實現呼叫就明白怎麼回事了:

RocketMQ(九):訊息傳送(續)
  • 獲取到所有可傳送的資訊

  • 傳送內容

  • 用來區分(比如訂單號,這一類的訂單號是有順序的,但是和其他訂單號可以無序)

 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這裡有一個好處,就是在批量傳送的時候,會做一個簡單的轉換,減少網路傳輸,學習下:

RocketMQ(九):訊息傳送(續)

把這些轉化為a、b、c等形式。

我們來看看rocketmq給我們的批量傳送的例子,為什麼會給我們2個例子呢?需要思考!!!,下面我會來為大家講解下:

備註: 批量傳送需要相同的topic以及相同的waitStoreMsgOK 和不支援定時傳送。

Messages of the same batch should have: same topic, same waitStoreMsgOK and no schedule support。

RocketMQ(九):訊息傳送(續)

這種傳送就是批量(這裡的批量不是特別大),就自己傳送走了。

RocketMQ(九):訊息傳送(續)

這裡的批量(批量的資料太多),所以進行分割之後傳送了。最後呼叫的方法還是一樣的。

我們知道目前rocketmq預設支援4M傳送訊息內容(不管是一條還是批量),假如需要調整也可以調整,那麼會一直沒有上限嗎?還有很多人說調整了10M為什麼沒有生效(這裡是需要Producer和服務端broker都調整才行,後續說明解釋,還有由於是基於netty網路傳輸,可能你需要看看RocketMQ(二):RPC通訊,這裡進行了說明)

RocketMQ(九):訊息傳送(續)

這裡決定了最大最大隻能是16M,如果需要就需要修改了,一般也不建議修改,就和批量傳送的第二個方式一樣就行,進行拆開批量傳送就是了。


如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【匠心零度】,查閱更多精彩歷史!!!

加入知識星球,一起探討!

img

相關文章