All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.joyqueue.service.impl.LeaderServiceImpl Maven / Gradle / Ivy

/**
 * Copyright 2019 The JoyQueue Authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.joyqueue.service.impl;

import com.alibaba.fastjson.JSON;
import org.joyqueue.domain.PartitionGroup;
import org.joyqueue.exception.ServiceException;
import org.joyqueue.model.domain.Broker;
import org.joyqueue.model.domain.TopicPartitionGroup;
import org.joyqueue.nsr.BrokerNameServerService;
import org.joyqueue.nsr.PartitionGroupServerService;
import org.joyqueue.nsr.TopicNameServerService;
import org.joyqueue.service.LeaderService;
import org.joyqueue.util.NullUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service("leaderService")
public class LeaderServiceImpl implements LeaderService {
    private Logger logger= LoggerFactory.getLogger(BrokerMonitorServiceImpl.class);

    @Autowired
    private BrokerNameServerService brokerNameServerService;

    @Autowired
    private TopicNameServerService topicNameServerService;

    @Autowired
    private PartitionGroupServerService partitionGroupServerService;

    @Override
    public List findPartitionGroupLeaderBroker(String topic,String namespace) {
        try {
            List topicPartitionGroups = partitionGroupServerService.findByTopic(topic,namespace);
            if(null == topicPartitionGroups){ throw new IllegalArgumentException("topic partition group is null");}
            if( topicPartitionGroups.isEmpty()){ return Collections.EMPTY_LIST;}
            return findPartitionGroupLeaderBroker(topicPartitionGroups);
        }catch (Exception e){
            throw new ServiceException(ServiceException.INTERNAL_SERVER_ERROR, e.getMessage());
        }
    }

    private List findPartitionGroupLeaderBroker(List topicPartitionGroups){
        if(NullUtil.isEmpty(topicPartitionGroups)) throw new IllegalArgumentException("topic partition group is null");
        try {
            return topicNameServerService.findPartitionGroupMaster(topicPartitionGroups);
        }catch (Exception e){
            String errorMsg = String.format("topicId %d master group request error", topicPartitionGroups.get(0).getTopic().getId());
            logger.error(errorMsg, e);
            throw new ServiceException(ServiceException.INTERNAL_SERVER_ERROR, errorMsg);
        }
    }


    @Override
    public Map.Entry findPartitionGroupLeaderBrokerDetail(String namespace,String topic,int groupNo) {
        List topicPartitionGroups=new ArrayList<>();
        TopicPartitionGroup topicPartitionGroup=partitionGroupServerService.findByTopicAndGroup(namespace,topic,groupNo);
        topicPartitionGroups.add(topicPartitionGroup);
        List> partitionGroupLeaderBroker=findPartitionGroupLeaderBrokerDetail(topicPartitionGroups);
        if(!NullUtil.isEmpty(partitionGroupLeaderBroker)&&partitionGroupLeaderBroker.size()>0) {
            return partitionGroupLeaderBroker.get(0);
        }else return null;
    }

    @Override
    public Map.Entry findPartitionLeaderBrokerDetail(String namespace, String topic, int partition) {
        List topicPartitionGroups=partitionGroupServerService.findByTopic(topic, namespace);
        TopicPartitionGroup tp=null;
        for(TopicPartitionGroup t:topicPartitionGroups){
            Set partitions=parsePartitions(t);
            if(partitions.contains((short)partition)){
                tp=t;
                break;
            }
        }
        return tp==null?null:findPartitionGroupLeaderBrokerDetail(namespace,topic,tp.getGroupNo());
    }

    @Override
    public List findLeaderBroker(String topic,String namespace) {
        List partitionGroups = findPartitionGroupLeaderBroker(topic,namespace);
        if(null == partitionGroups){return null;}
        if (NullUtil.isEmpty(partitionGroups)) {
            return Collections.EMPTY_LIST;
        }
        /**
         *
         * deal local single broker test,单机部署 无主
         **/
        Set brokerIds =  partitionGroups.stream().map(
                partitionGroup -> partitionGroup.getLeader()).collect(Collectors.toSet());
//        List brokers=brokerRepository.findByIds(brokerIds);
        List brokers = null;
        try {
            brokers = brokerNameServerService.getByIdsBroker(new ArrayList<>(brokerIds));
        } catch (Exception e) {
            logger.error("getByIdsBroker error",e);
        }
        if (NullUtil.isEmpty(brokers)) {
            // deal local single broker test
            if(brokers==null) brokers=new ArrayList<>();
        }
        return brokers;
    }

    @Override
    public List> findPartitionGroupLeaderBrokerDetail(String topic,String namespace) {
        return findPartitionGroupLeaderBrokerDetail(partitionGroupServerService.findByTopic(topic,namespace));

    }


    @Override
    public Map findPartitionLeaderBrokerDetail(String topic, String namespace) {
        Map partitionBrokerMap=new HashMap<>();
        List> partitionGroupBrokers=findPartitionGroupLeaderBrokerDetail(partitionGroupServerService.findByTopic(topic,namespace));
        for(Map.Entry e:partitionGroupBrokers){
           Set partitions=e.getKey().getPartitions();
           for(Short p:partitions) {
               partitionBrokerMap.put(p,e.getValue());
           }
        }
        return partitionBrokerMap;
    }

    /**
     * @param topicPartitionGroups
     * @return  a pair of partitionGroup,Broker
     **/
  private   List> findPartitionGroupLeaderBrokerDetail(List topicPartitionGroups){

      List>  partitionGroupBroker=new ArrayList<>();
      List partitionGroups = findPartitionGroupLeaderBroker(topicPartitionGroups);
      if (NullUtil.isEmpty(partitionGroups)) {
          return partitionGroupBroker;
      }
      /**
       *
       * deal local single broker test,单机部署 无主
       **/
      List brokerIds =  partitionGroups.stream().map(
              partitionGroup -> partitionGroup.getLeader()).collect(Collectors.toList());
      List brokers= null;
      try {
          //去重broker id
          List brokerIdList =  brokerIds.stream().distinct().map(brokerId -> brokerId).collect(Collectors.toList());
          brokers = brokerNameServerService.getByIdsBroker(brokerIdList);
      } catch (Exception e) {
          logger.error("brokerNameServerService.getByIdsBroker error",e);
      }
      // deal local single broker test
      if(NullUtil.isEmpty(brokers)) return partitionGroupBroker;
      Broker broker;
      Map  brokerMap= brokers.stream().collect(Collectors.toMap(Broker::getId,b -> b));
      for(PartitionGroup pg:partitionGroups){
          broker=brokerMap.get(Long.valueOf(pg.getLeader()));
          if(broker==null){
              logger.info("broker not found ");
          }
          partitionGroupBroker.add(new HashMap.SimpleEntry(pg,broker));
      }
      return partitionGroupBroker;
  }

    public Set parsePartitions(TopicPartitionGroup partitionGroup){
        Set partitionSet=new HashSet<>();
        String partitions=partitionGroup.getPartitions();
        if(partitions!=null&&partitions.trim().length()!=0){
            List partitionStrs= JSON.parseArray(partitions,String.class);
            for(String p:partitionStrs){
                if(p.trim().length()!=0){
                    partitionSet.add(Short.valueOf(p));
                }
            }
        }
        return partitionSet;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy