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。

RequestCodeMethodDescription
PUT_KV_CONFIGputKVConfig保存namespace下key、value到内存configTable,同时序列化到userHome/namesrv/kvConfig.json文件中。
GET_KV_CONFIGgetKVConfig从内存configTable中根据namespace和key获得配置的value值。
DELETE_KV_CONFIGdeleteKVConfig根据namespace和key删除value,同时序列化。
REGISTER_BROKERregisterBrokerWithFilterServerRouteInfoManager对象内在内存中保存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_BROKERunregisterBroker删除内存中注销的broker相关的信息,包括brokerLiveTable、filterServerTable、brokerAddrTable、clusterAddrTable、topicQueueTable。
GET_ROUTEINTO_BY_TOPICgetRouteInfoByTopic根据Topic名称首先从topicQueueTable获取所有的brokerName,然后根据brokerName从brokerAddrTable获取各个broker信息,同时将filterServerTable中broker相关的信息保存进返回值中。
GET_BROKER_CLUSTER_INFOgetBrokerClusterInfo将brokerAddrTable和clusterAddrTable存放到消息体内返回
WIPE_WRITE_PERM_OF_BROKERwipeWritePermOfBroker去除指定BrokerName的写权限,权限保存在topicQueueTable中的QueueData对象实例中。
GET_ALL_TOPIC_LIST_FROM_NAMESERVERgetAllTopicListFromNameserver从NameServer获取所有的Topic名称列表(topicQueueTable的keySet)
DELETE_TOPIC_IN_NAMESRVdeleteTopicInNamesrv从topicQueueTable中删除指定name的Topic
GET_KVLIST_BY_NAMESPACEgetKVListByNamespace根据NameSpace从configTable获取对应的配置。
GET_TOPICS_BY_CLUSTERgetTopicsByCluster先从clusterAddrTable获取Cluster内的BrokerName,根据BrokerName从topicQueueTable获取所有的Topic信息。
GET_SYSTEM_TOPIC_LIST_FROM_NSgetSystemTopicListFromNs获取Topic信息以及相关的地址信息。这里的systemTopic指的是各个集群名称和集群内的Broker名称,地址是各个broker内Master的IP。
GET_UNIT_TOPIC_LISTgetUnitTopicList获取单元Topic,是否为单元Topic由topicQueueTable中Topic值的第一个QueueData的topicSynFlag属性决定,topicSynFlag为1则为单元Topic。
GET_HAS_UNIT_SUB_TOPIC_LISTgetHasUnitSubTopicList获取有子单元Topic的Topic。
GET_HAS_UNIT_SUB_UNUNIT_TOPIC_LISTgetHasUnitSubUnUnitTopicList获取非单元Topic,同时存在子单元Topic的Topic。
UPDATE_NAMESRV_CONFIGupdateConfig更新nameServer的配置。
GET_NAMESRV_CONFIGgetConfig获取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子类的属性。消息头和消息码一般是一一对应的,且为硬编码
  • 消息体用于保存消息业务数据,使用字节传输。

消息属性

NameTypeRequestResponse
codeint请求的消息码,与特定消息头一一对应。识别不用的请求类型。响应码。0表示成功发送,其他代表不同异常,参见ResponseCode。
languageString请求方Producer的实现语言,默认为Java应答接收方(Broker)实现语言
versionint请求发起方程序版本应答接收方程序版本
opaqueint请求发起方在同一连接上不同的请求标识代码,多线程连接复用使用应答方不修改,直接返回
flagint通信层的标识位通信层的标识位
remarkString传输自定义文本信息错误消息描述信息
extFieldsMap自定义扩展字段,在请求时会将customHeader的属性存储在此属性中供响应方实例化customHeader。应答自定义字段
customHeaderCommandCustomHeader此属性不会在消息传输、序列化,只是作为解析辅助,方便消息处理。此属性不会在消息传输,只是作为处理辅助,方便消息处理。
bodybyte[]消息体,不会序列化,只会在消息传输,用于传输消息业务数据。消息体,不会序列化,只会在消息传输,用于传输消息业务数据。

概念

Cluster

一个Cluster代表一个Broker集群,由多个不同名的Broker组成。逻辑概念。

Broker

每个Broker由一到多个JVM实例组成,Broker内部根据BrokerID区分主从,0为主,其他为从。BrokerName相同的多个Broker为一个Broker。一般以BrokerName指代逻辑上的整体Broker,用BrokerAddr指代具体某个Broker。

Topic

每个Broker可以包含多个Topic,Broker和Topic是多对多的关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值