负载均衡,通过配置的权重选择“通道”或者其他等信息
直接看下面一段代码
/**
* 选择外呼通道
*
* @param list 外呼通道集合
* @return 外呼通道
*/
public CallWeight select(List<CallWeight> list) {
// Number of sends
int length = list.size();
// Every invoker has the same weight?
boolean sameWeight = true;
// the weight of every invokers
int[] weights = new int[length];
// the first invoker's weight
int firstWeight = list.get(0).getWeight();
weights[0] = firstWeight;
// The sum of weights
int totalWeight = firstWeight;
for (int i = 1; i < length; i++) {
int weight = list.get(i).getWeight();
// save for later use
weights[i] = weight;
// Sum
totalWeight += weight;
if (sameWeight && weight != firstWeight) {
sameWeight = false;
}
}
if (totalWeight > 0 && !sameWeight) {
// If (not every invoker has the same weight & at least one invoker's weight>0), select randomly based on totalWeight.
int offset = ThreadLocalRandom.current().nextInt(totalWeight);
// Return a invoker based on the random value.
for (int i = 0; i < length; i++) {
offset -= weights[i];
if (offset < 0) {
return list.get(i);
}
}
}
// If all invokers have the same weight value or totalWeight=0, return evenly.
return list.get(ThreadLocalRandom.current().nextInt(length));
}
今日时间有限,后续补充说明
参考连接:https://www.fadai.cc/posts/e128e668/