再议负载均衡算法
负载均衡的用途,路由等:
硬件方式: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的任务。(?待考)