1. 程式人生 > >RocketMQ 簡介 -- NameServer And Message

RocketMQ 簡介 -- NameServer And Message

RocketMQ NameServer And Message

NameServer

  • 管理以Key-Value的形式儲存各個NameSpace下的配置(userHome/namesrv/kvConfig.json)
  • 儲存、管理Cluster、Broker、Topic的資訊
  • 儲存自身的配置資訊(userHome/namesrv/namesrv.properties)

請求處理

請求是通過netty的Handler註冊到Netty中,處理類為NettyRequestProcessor介面的實現類,NameServer的預設處理類為:DefaultRequestProcessor。

RequestCode Method Description
PUT_KV_CONFIG putKVConfig 儲存namespace下key、value到記憶體configTable,同時序列化到userHome/namesrv/kvConfig.json檔案中。
GET_KV_CONFIG getKVConfig 從記憶體configTable中根據namespace和key獲得配置的value值。
DELETE_KV_CONFIG deleteKVConfig 根據namespace和key刪除value,同時序列化。
REGISTER_BROKER registerBrokerWithFilterServer RouteInfoManager物件內在記憶體中儲存broker、broker叢集、topic等的資訊: clusterAddrTable儲存key為叢集名稱,value為broker名稱集合。brokerAddrTable儲存key為broker名稱,value為BrokerData例項,BrokerData儲存叢集名、broker名以及broker相關的叢集資訊。topicQueueTable儲存key為topicName,value為Topic配置資訊的集合。 brokerLiveTable儲存key為brokerAddr,value為BrokerLiveInfo的broker存活資訊。 filterServerTable儲存key為brokerAddr,value為過濾服務端地址的集合。
UNREGISTER_BROKER unregisterBroker 刪除記憶體中登出的broker相關的資訊,包括brokerLiveTable、filterServerTable、brokerAddrTable、clusterAddrTable、topicQueueTable。
GET_ROUTEINTO_BY_TOPIC getRouteInfoByTopic 根據Topic名稱首先從topicQueueTable獲取所有的brokerName,然後根據brokerName從brokerAddrTable獲取各個broker資訊,同時將filterServerTable中broker相關的資訊儲存進返回值中。
GET_BROKER_CLUSTER_INFO getBrokerClusterInfo 將brokerAddrTable和clusterAddrTable存放到訊息體內返回
WIPE_WRITE_PERM_OF_BROKER wipeWritePermOfBroker 去除指定BrokerName的寫許可權,許可權儲存在topicQueueTable中的QueueData物件例項中。
GET_ALL_TOPIC_LIST_FROM_NAMESERVER getAllTopicListFromNameserver 從NameServer獲取所有的Topic名稱列表(topicQueueTable的keySet)
DELETE_TOPIC_IN_NAMESRV deleteTopicInNamesrv 從topicQueueTable中刪除指定name的Topic
GET_KVLIST_BY_NAMESPACE getKVListByNamespace 根據NameSpace從configTable獲取對應的配置。
GET_TOPICS_BY_CLUSTER getTopicsByCluster 先從clusterAddrTable獲取Cluster內的BrokerName,根據BrokerName從topicQueueTable獲取所有的Topic資訊。
GET_SYSTEM_TOPIC_LIST_FROM_NS getSystemTopicListFromNs 獲取Topic資訊以及相關的地址資訊。這裡的systemTopic指的是各個叢集名稱和叢集內的Broker名稱,地址是各個broker內Master的IP。
GET_UNIT_TOPIC_LIST getUnitTopicList 獲取單元Topic,是否為單元Topic由topicQueueTable中Topic值的第一個QueueData的topicSynFlag屬性決定,topicSynFlag為1則為單元Topic。
GET_HAS_UNIT_SUB_TOPIC_LIST getHasUnitSubTopicList 獲取有子單元Topic的Topic。
GET_HAS_UNIT_SUB_UNUNIT_TOPIC_LIST getHasUnitSubUnUnitTopicList 獲取非單元Topic,同時存在子單元Topic的Topic。
UPDATE_NAMESRV_CONFIG updateConfig 更新nameServer的配置。
GET_NAMESRV_CONFIG getConfig 獲取NameServer的配置

Message

RocketMQ中的訊息最終抽象為:RemotingCommand,訊息頭根據不同的訊息碼抽象為CommandCustomHeader介面的實現類。

由於訊息體內部使用4位元組表示訊息序列化方式(JSON/ROCKETMQ)和訊息總長度,所以RocketMQ支援的訊息最大長度為2的24次方,即16777216。int的最高8位會丟棄。訊息頭內的資料為RemotingCommand物件的屬性以及一個Map。

通過org.apache.rocketmq.remoting.netty.NettyEncoder和org.apache.rocketmq.remoting.netty.NettyDecoder對訊息進行加解密。

訊息格式為(數字為幾個位元組):

+———–+——————+————+——–+————–+
|總長度(4)|序列化型別(1)|頭長度(3)|頭資料|訊息體資料|
+———–+——————+————+——–+————–+

  • 總長度為:4+4+頭資料長度+訊息體資料長度,預設情況下,訊息的最大長度為:16777216,即2的24次方。
  • 序列化型別:0為JSON,1為ROCKETMQ。JSON格式可以很好的跨語言。
  • 頭長度為頭資料的長度。
  • 頭資料儲存RemotingCommand物件屬性以及一個Map(extFields),extFields用於儲存CommandCustomHeader子類的屬性。訊息頭和訊息碼一般是一一對應的,且為硬編碼
  • 訊息體用於儲存訊息業務資料,使用位元組傳輸。

訊息屬性

Name Type Request Response
code int 請求的訊息碼,與特定訊息頭一一對應。識別不用的請求型別。 響應碼。0表示成功傳送,其他代表不同異常,參見ResponseCode。
language String 請求方Producer的實現語言,預設為Java 應答接收方(Broker)實現語言
version int 請求發起方程式版本 應答接收方程式版本
opaque int 請求發起方在同一連線上不同的請求標識程式碼,多執行緒連線複用使用 應答方不修改,直接返回
flag int 通訊層的標識位 通訊層的標識位
remark String 傳輸自定義文字資訊 錯誤訊息描述資訊
extFields Map 自定義擴充套件欄位,在請求時會將customHeader的屬性儲存在此屬性中供響應方例項化customHeader。 應答自定義欄位
customHeader CommandCustomHeader 此屬性不會在訊息傳輸、序列化,只是作為解析輔助,方便訊息處理。 此屬性不會在訊息傳輸,只是作為處理輔助,方便訊息處理。
body byte[] 訊息體,不會序列化,只會在訊息傳輸,用於傳輸訊息業務資料。 訊息體,不會序列化,只會在訊息傳輸,用於傳輸訊息業務資料。

概念

Cluster

一個Cluster代表一個Broker叢集,由多個不同名的Broker組成。邏輯概念。

Broker

每個Broker由一到多個JVM例項組成,Broker內部根據BrokerID區分主從,0為主,其他為從。BrokerName相同的多個Broker為一個Broker。一般以BrokerName指代邏輯上的整體Broker,用BrokerAddr指代具體某個Broker。

Topic

每個Broker可以包含多個Topic,Broker和Topic是多對多的關係。