一个巧妙的负载均衡算法-翘动你的大脑
有一个愿分享的领导还是很棒的。
现在的负载均衡技术,可以说是满大街都是,但是我们基本都停留在了使用的阶段上,并没有真正深入去了解其核心。如果真的出现了问题,可能就很难知道是什么原因导致了,只能去google,百度了。 因此,了解一些核心的东西,还是不错的。
负载均衡大概流程就是,随时收集各服务器信息或者各服务器主动上报信息,由配置主心进行保存,计算出权重,然后根据相应算法进行服务机器选择。(当然了,这不是本文的重点,我也说得不一定对)
我要展示的是,一个根据权重进行机器选择的一个巧妙算法,如下:
int chooseOneRoute ( LB_SvrInfo * & pSvr ) { double dblTotalWeight = 0.0; int i = 0; time_t curTime = time(NULL); //权重的计算方法是Late方法 if ( curTime - calWeightTime >= CAL_WEIGHT_TIME_INTERVAL ) { calculateWeight(); } //先把各服务器权重加起来 for ( i = 0; i < MAX_SERVER_NUM; i++ ) { if ( !oServerInfo[i].isOkForRoute() ) continue; dblTotalWeight += oServerInfo[i].getWeight(); } dblTotalWeight *= rand() / ( RAND_MAX + 1.0 ); //做减法 for ( i = 0; i < MAX_SERVER_NUM; i++ ) { if ( !oServerInfo[i].isOkForRoute() ) continue; dblTotalWeight -= oServerInfo[i].getWeight(); //找到对应服务器 if ( dblTotalWeight < 0 ) break; } pSvr = &( oServerInfo[i] ); return 0; }
分步解释就是:
1. 先计算得到各机器的权重值,保存起来;
2. 按顺序将各机器权重相加,相加之后就相当于各机器在总权重上占了各相应的一段比例;
3. 取随机数,得到一个0~1的随机值,并乘以总权重,作为选中机器的标志;
4. 再按顺序减去各机器的权重,当减到选择机器的权重范围时,就得到了机器号,从而选定该机器。
算法示意图如下:
服务器权重越高,在线段上占的长度越长,被随机数选中的概率也越大。
刚开始的时候,我以为是哪个数学家搞出来的公式得到的呢,结果原理却出奇的简单,所以好的东西不一定是复杂的,或者说看起来牛逼的东西,不一定就很复杂,但是肯定是大多数人意想不到的。
涨姿势了!
不要害怕今日的苦,你要相信明天,更苦!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2016-12-14 《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路