静态负载均衡算法的简单说明

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

静态负载均衡算法的简单说明

实现的问题:

目前有N个资源Scale1~ScaleN,且这N个资源正在处理个数不等的请求,这时发来M个请求。

如何把M个请求分发到这N个资源中,使得分发完之后这N个资源所处理的请求是均衡的。

名词定义

Scale-资源

Order-请求

compId-每个资源的唯一标识

compId数组-compIdArr

根据每个Scale目前所处理的Order个数多少,从小到大把其对应的compId记录在数组中

负载分配数组-dispatchCountArr

对于dispatchCountArr[i],它的值表示的是可以分发的Order的个数,

分发的compId的范围是在compIdArr[0]到compIdArr[i]之间。

例,如果有3个Scale,它们的compId和当前的Order个数分别为

Scale1:1,Scale2:5,Scale3:12

那么根据这组数据可以构造一个负载分配数组

dispatchCountArr[0]=(5-1)*1=4 表示可以在Scale1上再分配4个Order

dispatchCountArr[1]=(12-5)*2=14 表示可以在Scale1和Scale2上平均分配14个Order

dispatchCountArr[2]=整型最大值表示可以在Scale1~Scale3上再平均分配任意个Order

当有多个Order订单,需要为每个都分配一个compId时,

1.先从dispatchCountArr[0]开始,如果dispatchCountArr[0]不为0,说明可以把这个订单指派给Scale1,

并且dispatchCountArr[0]的值减1;

2.如果发现dispatchCountArr[0]已经为0,则继续看dispatchCountArr[1],

如果大于0,说明可以再从Scale1和Scale2中取一个进行指派,用dispatchCountArr[1] mod 2产生一个0到1

的index,意思是在Scale1和Scale2之间进行平均分配,取compIdArr[index]作为分配的compId,

同时dispatchCountArr[1]减1

3.如果dispatchCountArr[1]也被减为0,那么继续看dispatchCountArr[2],类似2中的操作,

用dispatchCountArr[2] mod 3产生一个0到2的index,意思是在Scale1到Scale3

之间进行平均指派,

取compIdArr[index]作为compId,同时dispatchCountArr[2]减1

4.重复3中的操作,直到所有的Order都已经被分配了一个compId

[Java]代码

package org.zmy.util;

import java.util.ArrayList;

/**

* Order负载均衡实现类

*

*/

public class OrderDispatcher {

private String[] compIdArr = null; //参加负载均衡的compId数组

private int[] dispatchCountArr = null; //负载分配数组

public OrderDispatcher() {

}

/**

* 初始化compId数组和负载分配数组

* @param scaleStaticList

*/

public void init(ArrayList scaleStaticList) {

if (!scaleStaticList.isEmpty()) {

compIdArr = new String[scaleStaticList.size()];

dispatchCountArr = new int[scaleStaticList.size()];

}

/**

* 静态负载均衡算法的简单说明

* 实现的问题:

* 目前有N个资源Scale1~ScaleN,且这N个资源正在处理个数不等的请求,这时发来M个请求。

* 如何把M个请求分发到这N个资源中,使得分发完之后这N个资源所处理的请求是均衡的。

*

* 名词定义

* Scale-资源

* Order-请求

* compId-每个资源的唯一标识

*

* compId数组-compIdArr

* 根据每个Scale目前所处理的Order个数多少,从小到大把其对应的compId记录在数组中

*

* 负载分配数组-dispatchCountArr

* 对于dispatchCountArr[i],它的值表示的是可以分发的Order的个数,

* 分发的compId的范围是在compIdArr[0]到compIdArr[i]之间。

* 例,如果有3个Scale,它们的compId和当前的Order个数分别为

* Scale1:1,Scale2:5,Scale3:12

* 那么根据这组数据可以构造一个负载分配数组

* dispatchCountArr[0]=(5-1)*1=4 表示可以在Scale1上再分配4个Order

* dispatchCountArr[1]=(12-5)*2=14 表示可以在Scale1和Scale2上平均分配14个Order

* dispatchCountArr[2]=整型最大值表示可以在Scale1~Scale3上再平均分配任意个Order

*

* 当有多个Order订单,需要为每个都分配一个compId时,

* 1.先从dispatchCountArr[0]开始,如果dispatchCountArr[0]不为0,说明可以把这个订单指派给Scale1,

* 并且dispatchCountArr[0]的值减1;

*

* 2.如果发现dispatchCountArr[0]已经为0,则继续看dispatchCountArr[1],

* 如果大于0,说明可以再从Scale1和Scale2中取一个进行指派,用dispatchCountArr[1] mod 2产生一个0到1

* 的index,意思是在Scale1和Scale2之间进行平均分配,取compIdArr[index]作为分配的compId,

* 同时dispatchCountArr[1]减1

*

* 3.如果dispatchCountArr[1]也被减为0,那么继续看dispatchCountArr[2],类似2中的操作,

* 用dispatchCountArr[2] mod 3产生一个0到2的index,意思是在Scale1到Scale3之间进行平均指派,

* 取compIdArr[index]作为compId,同时dispatchCountArr[2]减1

*

* 4.重复3中的操作,直到所有的Order都已经被分配了一个compId

*/

int size = scaleStaticList.size();

for (int i = 0; i < size; i++) {

compIdArr[i] = scaleStaticList.get(i).compId;

相关文档
最新文档