This is an automated email from the ASF dual-hosted git repository. iluo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/master by this push: new 63bf28d feat:Improve the annotation of LeastActiveLoadBalance (#2893) 63bf28d is described below commit 63bf28da8c173f474a5643ca716876db2d3aae9a Author: zhuzi <42179163+hao-zh...@users.noreply.github.com> AuthorDate: Thu Dec 6 19:32:11 2018 +0800 feat:Improve the annotation of LeastActiveLoadBalance (#2893) --- .../loadbalance/LeastActiveLoadBalance.java | 69 +++++++++++++++------- 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/LeastActiveLoadBalance.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/LeastActiveLoadBalance.java index 1516317..860dd3d 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/LeastActiveLoadBalance.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/LeastActiveLoadBalance.java @@ -26,6 +26,11 @@ import java.util.concurrent.ThreadLocalRandom; /** * LeastActiveLoadBalance + * <p> + * Filter the number of invokers with the least number of active calls and count the weights and quantities of these invokers. + * If there is only one invoker, use the invoker directly; + * if there are multiple invokers and the weights are not the same, then random according to the total weight; + * if there are multiple invokers and the same weight, then randomly called. */ public class LeastActiveLoadBalance extends AbstractLoadBalance { @@ -33,27 +38,48 @@ public class LeastActiveLoadBalance extends AbstractLoadBalance { @Override protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) { - int length = invokers.size(); // Number of invokers - int leastActive = -1; // The least active value of all invokers - int leastCount = 0; // The number of invokers having the same least active value (leastActive) - int[] leastIndexes = new int[length]; // The index of invokers having the same least active value (leastActive) - int totalWeight = 0; // The sum of with warmup weights - int firstWeight = 0; // Initial value, used for comparision - boolean sameWeight = true; // Every invoker has the same weight value? + // Number of invokers + int length = invokers.size(); + // The least active value of all invokers + int leastActive = -1; + // The number of invokers having the same least active value (leastActive) + int leastCount = 0; + // The index of invokers having the same least active value (leastActive) + int[] leastIndexes = new int[length]; + // The sum of the warmup weights of all the least active invokes + int totalWeight = 0; + // The weight of the first least active invoke + int firstWeight = 0; + // Every least active invoker has the same weight value? + boolean sameWeight = true; + + // Filter out all the least active invokers for (int i = 0; i < length; i++) { Invoker<T> invoker = invokers.get(i); - int active = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName()).getActive(); // Active number + // Get the active number of the invoke + int active = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName()).getActive(); + // Get the weight of the invoke configuration. The default value is 100. int afterWarmup = getWeight(invoker, invocation); - if (leastActive == -1 || active < leastActive) { // Restart, when find a invoker having smaller least active value. - leastActive = active; // Record the current least active value - leastCount = 1; // Reset leastCount, count again based on current leastCount - leastIndexes[0] = i; // Reset - totalWeight = afterWarmup; // Reset - firstWeight = afterWarmup; // Record the weight the first invoker - sameWeight = true; // Reset, every invoker has the same weight value? - } else if (active == leastActive) { // If current invoker's active value equals with leaseActive, then accumulating. - leastIndexes[leastCount++] = i; // Record index number of this invoker - totalWeight += afterWarmup; // Add this invoker's with warmup weight to totalWeight. + // If it is the first invoker or the active number of the invoker is less than the current least active number + if (leastActive == -1 || active < leastActive) { + // Reset the active number of the current invoker to the least active number + leastActive = active; + // Reset the number of least active invokers + leastCount = 1; + // Put the first least active invoker first in leastIndexs + leastIndexes[0] = i; + // Reset totalWeight + totalWeight = afterWarmup; + // Record the weight the first least active invoker + firstWeight = afterWarmup; + // Each invoke has the same weight (only one invoker here) + sameWeight = true; + // If current invoker's active value equals with leaseActive, then accumulating. + } else if (active == leastActive) { + // Record the index of the least active invoker in leastIndexs order + leastIndexes[leastCount++] = i; + // Accumulate the total weight of the least active invoker + totalWeight += afterWarmup; // If every invoker has the same weight? if (sameWeight && i > 0 && afterWarmup != firstWeight) { @@ -61,13 +87,14 @@ public class LeastActiveLoadBalance extends AbstractLoadBalance { } } } - // assert(leastCount > 0) + // Choose an invoker from all the least active invokers if (leastCount == 1) { // If we got exactly one invoker having the least active value, return this invoker directly. return invokers.get(leastIndexes[0]); } if (!sameWeight && totalWeight > 0) { - // If (not every invoker has the same weight & at least one invoker's weight>0), select randomly based on totalWeight. + // If (not every invoker has the same weight & at least one invoker's weight>0), select randomly based on + // totalWeight. int offsetWeight = ThreadLocalRandom.current().nextInt(totalWeight) + 1; // Return a invoker based on the random value. for (int i = 0; i < leastCount; i++) { @@ -81,4 +108,4 @@ public class LeastActiveLoadBalance extends AbstractLoadBalance { // If all invokers have the same weight value or totalWeight=0, return evenly. return invokers.get(leastIndexes[ThreadLocalRandom.current().nextInt(leastCount)]); } -} +} \ No newline at end of file