再议负载均衡算法

负载均衡的用途,路由等:

硬件方式:F5的负载均衡设备(张善友的以此起头,C#编写,ASP.NET Session State Partitioning using State Server Load Balancing)ASP.NET记录会话状态,采用负载均衡算法来分区存储状态数据。

软件方式:IP层,章文嵩的LVS

     HTTP层:ngnix

     HTTP层:dobbo(cluster)(java)https://segmentfault.com/a/1190000009594166 (?待学)

 

 以前遇到的一个场景也适用:有很多大个的ELT文件,需要拷贝到HPC Cluster的各台机器上,各台机器的可用磁盘空间不一样,可以以此为权重,用负载均衡算法分配,效果较好。当初用了随机分配,检查哪个硬盘可用空间更大,就往哪个上拷贝的方式,这样的缺点,就是每次拷贝文件之前,都增加一次检查磁盘可用空间的操作,浪费了时间,增加了磁盘管理器的负担。

 

一个业务场景:专利代理部门,新人(或实习生)与资深代理人的权重不一样,要按权重分工。参考如下算法(实现是否正确未验证):

class Server{  
    private String ip;  
    private String port;  
    public int weight;  
}  
class LoadBalancer{  
    private static List<Server> list=new List<Server>();  
    private static int totalWeight=0;  
    static{//加载配置文件,将解析的服务器列表添加到list中.同时计算出总权重值  
        //list.add(server);  
        //totalWeight+=server.weight;  
    }  
    private static LoadBalancer loadBalancer=new LoadBalancer();  
    private LoadBalancer(){}  
    public static LoadBalancer getLoadBalancer(){  
        return loadBalancer;  
    }  
    public Server getServer(){  
        int sum=0;  
        int rand=(int)(1+Math.random()*totalWeight);  
        for(Server serv : list){////由概率区间值决定服务器的分配  
            sum+=serv.weight;  
            if(rand<=sum){  
                return serv;  
            }else{  
                continue;  
            }  
        }  
        return null;//不会出现这种情况。  
    }  
}  

参照上述方法改造上述场景的话,Server这个概念抽象形容人不太合适,不如用Worker更好。Worker不用IP和Port,这两个组合抽象成一个ID即可。

另外,Selenium Grid,应该也是采用的负载均衡算法分配的WebDriver的任务。(?待考)

posted @ 2017-09-19 10:00  任国强  阅读(306)  评论(0编辑  收藏  举报