weblogic中loadbalance的算法

BasicReplicaHandler.java protected RemoteReference chooseReplica(RemoteReference remotereference, Method method, Object aobj[]) { ReplicaList replicalist = replicaList; JVM INSTR monitorenter ; int i = replicaList.size(); if(i == 0) return remotereference; current = (current + 1) % i;//选下一个 replicaList.get(current); replicalist; JVM INSTR monitorexit ; return; Exception exception; exception; throw exception; } weblogic 中 loadbalance的三种典型算法:


随机

RandomReplicaHandler.java protected RemoteReference chooseReplica(RemoteReference remotereference, Method method, Object aobj[]) { RandomReplicaHandler randomreplicahandler = this; JVM INSTR monitorenter ; ReplicaList replicalist; int i; replicalist = getReplicaList(); i = replicalist.size(); if(i == 0) return remotereference; int j; double d = Math.random() * (double)i + 0.5D; // 随机数 j = (int)Math.round(d) - 1; replicalist.get(j); randomreplicahandler; JVM INSTR monitorexit ; return; Exception exception; exception; throw exception; }

权重

WeightBasedReplicaHandler.java RichReplicaList.java protected RemoteReference chooseReplica(RemoteReference remotereference, Method method, Object aobj[]) { RichReplicaList richreplicalist = (RichReplicaList)getReplicaList(); RemoteReference remotereference1 = remotereference; synchronized(richreplicalist) { if(infoArray == null || infoArray.length == 0) reinitializeWeightInfo(remotereference.getHostID()); if(size != 0) { for(int i = lastIndex; i < size + lastIndex; i++) { listIter = ++listIter % size;//用于判断是否重新计算当前调度的权值 if(listIter == 0) loopCounter = ++loopCounter % maxIter;//当前调度的权值 int j = i % size; if(infoArray[j].getNormalizedWeight() <= loopCounter) continue; remotereference1 = richreplicalist.findReplicaHostedBy(infoArray[j].getID());//大于当前调度的权值 if(remotereference1 == null) continue; lastIndex = ++j; break; } } } return remotereference1; } maxIter: void resetAndNormalizeWeights() { int i = 0x7fffffff; //32位最大整数 int j = 0x80000000; //32位最小整数 boolean flag = true; synchronized(this) { serverInfoArray = ServerInfoManager.theOne().getServerInfos(); for(int k = 0; k < serverInfoArray.length; k++) { int i1 = serverInfoArray[k].getLoadWeight(); flag &= i1 % 10 == 0; if(i > i1) i = i1; //最小权重,尚未格式化 if(i1 > j) j = i1; //最大权重,尚未格式化 } int l = 0; if(serverInfoArray.length > 0) while(serverInfoArray[l].getLoadWeight() % i == 0 && ++l < serverInfoArray.length) ; if(l > serverInfoArray.length) { normalizeWeights(i, serverInfoArray); loopIter = j / i; } else if(flag) { normalizeWeights(10, serverInfoArray); loopIter = j / 10; } else { normalizeWeights(5, serverInfoArray); loopIter = j / 5; } } }

顺序


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值