当前位置: 首页 > 后端技术 > Node.js

Nodejs负载均衡(二):RPC负载均衡

时间:2023-04-03 11:55:17 Node.js

介绍这篇文章确实拖了好久。上一节讲了服务负载均衡的实现,但是如果需要调用远程服务,如何保证调用不会集中在一个服务上如何保证远程服务调用的负载均衡?这是为了实现消费者调用rpc的负载均衡。所以本文主要讲解RPC负载均衡算法的实现。算法下面介绍几种主要的负载均衡算法是如何实现的。可以看到我写的npm包load-balancer-algorithm。constLBA=require('负载均衡算法');constweightRandomPool=[{host:"127.0.0.2",weight:2},{host:"127.0.0.1",weight:3},{host:"127.0.0.3",weight:5},];constweightedList=[]constloadBalance=newLBA.WeightedRoundRobin(weightRandomPool);for(leti=0;i<10;i++){constaddress=loadBalance.pick();weightedList.push(loadBalance.getWeight(address.host))}//[5,5,3,5,2,3,5,2,3,5]console.log(weightedList)RoundRobin轮询(Roundrobin)算法,就是依次轮询服务队列的节点,周而复始。这个实现比较简单。消费者端调用balance通过当前下标+1对数据池长度取模,得到下一个节点下标缺点:需要服务提供一致的节点性能WeightedRoundRobin加权轮循(Weightedroundrobin)算法,基于轮询权重判断,可以减少低性能服务节点的流量。动态权重调整和实时同步是比较平衡的算法,但是权重大的服务节点会突然增加负载,所以出现平滑加权轮循(smoothweightedroundrobin),就是平滑分布获取节点[{host:"127.0.0.1",weight:2},{host:"127.0.0.2",weight:3},{host:"127.0.0.3",weight:5},]//正常//[5,5,5,5,5,3,3,3,2,2]//smooth//[5,5,3,5,2,3,5,2,3,5]SourceIPHashSourceIPhash(consistenthash)算法,为了将客户端IP请求固定分配给一个服务器,实现同一个session。看consistenthashwithvirtualnodes的实现,目前主流推荐。通过节点IP生成N个哈希,然后通过哈希得到N个虚拟节点的值,再将请求数据(ip或参数)生成的哈希与距离最近的节点进行比较。Nodejs主要用于stickysession模式,保证所有的访问都是相同的一个session对一个服务的缺点:相对于其他算法,负载均衡较低,性能相对较低。如果固定IP服务挂了,用户session就会丢失,所以最好的办法就是共享session。示例:图中每个节点生成2个虚拟节点,然后根据请求的数据生成哈希值,比较哪个值最相似,决定访问哪个节点。随机(Random)算法在池长度范围内随机生成一个整数,从而随机获得机器。碰撞率高,但调用次数越多,分布越均匀。0到pool.length范围内的值。WeightedRandom加权随机(weightedrandom)算法,如果机器的性能不一致,那么就需要在随机的基础上增加权重计算。从0到totalWeighted随机取一个值,然后依次减去pool的节点权重。如果小于0,则表示随机值落在当前权重范围内。让offset=randomInteger(totalWeight);for(leti=0;i