RocketMQ 簡介 -- NameServer And Message
阿新 • • 發佈:2019-01-11
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是多對多的關係。