org.apache.eventmesh.common.loadbalance.WeightRoundRobinLoadBalanceSelector Maven / Gradle / Ivy
The newest version!
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.eventmesh.common.loadbalance;
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
/**
* This selector use the weighted round robin strategy to select from list. If the weight is greater, the probability of being selected is larger.
*
* @param Target type
*/
@Slf4j
public class WeightRoundRobinLoadBalanceSelector implements LoadBalanceSelector {
private final transient List> clusterGroup;
private final transient int totalWeight;
public WeightRoundRobinLoadBalanceSelector(List> clusterGroup) {
int totalWeight = 0;
for (Weight weight : clusterGroup) {
totalWeight += weight.getValue();
}
this.clusterGroup = clusterGroup;
this.totalWeight = totalWeight;
}
@Override
@SuppressWarnings("ConstantConditions")
public T select() {
if (CollectionUtils.isEmpty(clusterGroup)) {
log.warn("No servers available");
return null;
}
Weight targetWeight = null;
for (Weight weight : clusterGroup) {
weight.increaseCurrentWeight();
if (targetWeight == null || targetWeight.getCurrentWeight().get() < weight.getCurrentWeight().get()) {
targetWeight = weight;
}
}
targetWeight.decreaseTotal(totalWeight);
return targetWeight.getTarget();
}
@Override
public LoadBalanceType getType() {
return LoadBalanceType.WEIGHT_ROUND_ROBIN;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy