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是多对多的关系。

扫描二维码关注公众号,回复: 1651454 查看本文章

猜你喜欢

转载自blog.csdn.net/woshismyawei/article/details/79916581