rocketmq-namesrv

namesrv

主要属性

HashMap<String/* topic */, List<QueueData>> topicQueueTable;
HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

线程池

remotingExecutor ,FileWatchService,scheduledExecutorService

方法

REGISTER_BROKER (broker注册信息)

​ 数据结构参考:

{
	"filterServerList": [],
	"topicConfigSerializeWrapper": {
		"dataVersion": {
			"counter": 5,
			"timestamp": 1557310027685
		},
		"topicConfigTable": {
			"TopicTest050804": {
				"order": false,//是否是顺序
				"perm": 6,//权限
				"readQueueNums": 4,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "TopicTest050804",
				"topicSysFlag": 0,
				"writeQueueNums": 4
			},
			"TopicTest050803": {
				"order": false,
				"perm": 6,
				"readQueueNums": 4,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "TopicTest050803",
				"topicSysFlag": 0,
				"writeQueueNums": 4
			},
			"TopicTest": {
				"order": false,
				"perm": 6,
				"readQueueNums": 4,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "TopicTest",
				"topicSysFlag": 0,
				"writeQueueNums": 4
			},
			"SELF_TEST_TOPIC": {
				"order": false,
				"perm": 6,
				"readQueueNums": 1,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "SELF_TEST_TOPIC",
				"topicSysFlag": 0,
				"writeQueueNums": 1
			},
			"DefaultCluster": {
				"order": false,
				"perm": 7,
				"readQueueNums": 16,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "DefaultCluster",
				"topicSysFlag": 0,
				"writeQueueNums": 16
			},
			"RMQ_SYS_TRANS_HALF_TOPIC": {
				"order": false,
				"perm": 6,
				"readQueueNums": 1,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "RMQ_SYS_TRANS_HALF_TOPIC",
				"topicSysFlag": 0,
				"writeQueueNums": 1
			},
			"penghaozhong-01-broker": {
				"order": false,
				"perm": 7,
				"readQueueNums": 1,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "penghaozhong-01-broker",
				"topicSysFlag": 0,
				"writeQueueNums": 1
			},
			"TBW102": { //系统topic
				"order": false,
				"perm": 7,
				"readQueueNums": 8,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "TBW102",
				"topicSysFlag": 0,
				"writeQueueNums": 8
			},
			"BenchmarkTest": {
				"order": false,
				"perm": 6,
				"readQueueNums": 1024,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "BenchmarkTest",
				"topicSysFlag": 0,
				"writeQueueNums": 1024
			},
			"OFFSET_MOVED_EVENT": {
				"order": false,
				"perm": 6,
				"readQueueNums": 1,
				"topicFilterType": "SINGLE_TAG",
				"topicName": "OFFSET_MOVED_EVENT",
				"topicSysFlag": 0,
				"writeQueueNums": 1
			}
		}
	}
}

接收broker注册请求。

代码入口org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#processRequest

 @Override
    public RemotingCommand processRequest(ChannelHandlerContext ctx,
        RemotingCommand request) throws RemotingCommandException {

        if (ctx != null) {
            log.debug("receive request, {} {} {}",
                request.getCode(),
                RemotingHelper.parseChannelRemoteAddr(ctx.channel()),
                request);
        }

        switch (request.getCode()) {
            case RequestCode.PUT_KV_CONFIG:
                return this.putKVConfig(ctx, request);
            case RequestCode.GET_KV_CONFIG:
                return this.getKVConfig(ctx, request);
            case RequestCode.DELETE_KV_CONFIG:
                return this.deleteKVConfig(ctx, request);
            case RequestCode.QUERY_DATA_VERSION:
                return queryBrokerTopicConfig(ctx, request);
            // broker注册
            case RequestCode.REGISTER_BROKER:
                Version brokerVersion = MQVersion.value2Version(request.getVersion());
                if (brokerVersion.ordinal() >= MQVersion.Version.V3_0_11.ordinal()) {
                    return this.registerBrokerWithFilterServer(ctx, request);
                } else {
                    return this.registerBroker(ctx, request);
                }
            case RequestCode.UNREGISTER_BROKER:
                return this.unregisterBroker(ctx, request);
            //获取topic路由
            case RequestCode.GET_ROUTEINTO_BY_TOPIC:
                return this.getRouteInfoByTopic(ctx, request);
            case RequestCode.GET_BROKER_CLUSTER_INFO:
                return this.getBrokerClusterInfo(ctx, request);
            case RequestCode.WIPE_WRITE_PERM_OF_BROKER:
                return this.wipeWritePermOfBroker(ctx, request);
            case RequestCode.GET_ALL_TOPIC_LIST_FROM_NAMESERVER:
            。。。
 public RemotingCommand registerBrokerWithFilterServer(ChannelHandlerContext ctx, RemotingCommand request)
        throws RemotingCommandException {
        final RemotingCommand response = RemotingCommand.createResponseCommand(RegisterBrokerResponseHeader.class);
        final RegisterBrokerResponseHeader responseHeader = (RegisterBrokerResponseHeader) response.readCustomHeader();
        final RegisterBrokerRequestHeader requestHeader =
            (RegisterBrokerRequestHeader) request.decodeCommandCustomHeader(RegisterBrokerRequestHeader.class);

        // 检查数据是否有丢失
        if (!checksum(ctx, request, requestHeader)) {
            response.setCode(ResponseCode.SYSTEM_ERROR);
            response.setRemark("crc32 not match");
            return response;
        }

        RegisterBrokerBody registerBrokerBody = new RegisterBrokerBody();

        // 数据解码
        if (request.getBody() != null) {
            try {
                registerBrokerBody = RegisterBrokerBody.decode(request.getBody(), requestHeader.isCompressed());
            } catch (Exception e) {
                throw new RemotingCommandException("Failed to decode RegisterBrokerBody", e);
            }
        } else {
            registerBrokerBody.getTopicConfigSerializeWrapper().getDataVersion().setCounter(new AtomicLong(0));
            registerBrokerBody.getTopicConfigSerializeWrapper().getDataVersion().setTimestamp(0);
        }

        // 注册topic路由
        RegisterBrokerResult result = this.namesrvController.getRouteInfoManager().registerBroker(
            requestHeader.getClusterName(),
            requestHeader.getBrokerAddr(),
            requestHeader.getBrokerName(),
            requestHeader.getBrokerId(),
            requestHeader.getHaServerAddr(),
            registerBrokerBody.getTopicConfigSerializeWrapper(),
            registerBrokerBody.getFilterServerList(),
            ctx.channel());

        responseHeader.setHaServerAddr(result.getHaServerAddr());
        responseHeader.setMasterAddr(result.getMasterAddr());

        byte[] jsonValue = this.namesrvController.getKvConfigManager().getKVListByNamespace(NamesrvUtil.NAMESPACE_ORDER_TOPIC_CONFIG);
        response.setBody(jsonValue);

        response.setCode(ResponseCode.SUCCESS);
        response.setRemark(null);
        return response;
    }

GET_ROUTEINTO_BY_TOPIC(根据topic获取路由)

producer和consumer根据topic获取路由

private List<QueueData> queueDatas;
private List<BrokerData> brokerDatas;
private HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

broker注册namesrv

Broker 是怎么选择namesrv的?

1.broker设置namasrv地址

  brokerConfig.setNamesrvAddr("localhost:9876;localhost:9877");
List<String> nameServerAddressList = this.remotingClient.getNameServerAddressList();
        if (nameServerAddressList != null && nameServerAddressList.size() > 0) {

            final RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader();
            requestHeader.setBrokerAddr(brokerAddr);
            requestHeader.setBrokerId(brokerId);
            requestHeader.setBrokerName(brokerName);
            requestHeader.setClusterName(clusterName);
            requestHeader.setHaServerAddr(haServerAddr);
            requestHeader.setCompressed(compressed);

            RegisterBrokerBody requestBody = new RegisterBrokerBody();
            requestBody.setTopicConfigSerializeWrapper(topicConfigWrapper);
            requestBody.setFilterServerList(filterServerList);
            final byte[] body = requestBody.encode(compressed);
            final int bodyCrc32 = UtilAll.crc32(body);
            requestHeader.setBodyCrc32(bodyCrc32);
            final CountDownLatch countDownLatch = new CountDownLatch(nameServerAddressList.size());
            // 循环注册namesrv
            for (final String namesrvAddr : nameServerAddressList) {
                brokerOuterExecutor.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            RegisterBrokerResult result = registerBroker(namesrvAddr,oneway, timeoutMills,requestHeader,body);
                            if (result != null) {
                                registerBrokerResultList.add(result);
                            }

                            log.info("register broker to name server {} OK", namesrvAddr);
                        } catch (Exception e) {
                            log.warn("registerBroker Exception, {}", namesrvAddr, e);
                        } finally {
                            countDownLatch.countDown();
                        }
                    }
                });
            }

转载于:https://my.oschina.net/penghaozhong/blog/3049541

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值