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