天天看點

RocketMQ 簡介 -- NameServer And MessageRocketMQ NameServer And Message

RocketMQ NameServer And Message

  • RocketMQ NameServer And Message
    • NameServer
      • 請求處理
    • Message
      • 消息屬性
    • 概念
      • Cluster
      • Broker
      • Topic

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是多對多的關系。

繼續閱讀