RocketMQ NameServer And Message
- RocketMQ NameServer And Message
- NameServer
- 請求處理
- Message
- 消息屬性
- 概念
- Cluster
- Broker
- Topic
- NameServer
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是多對多的關系。