2017-5-5/PHP实现负载均衡的加权轮询
<?php // php实现负载均衡的加权轮询(WRR) class WRR {// 每次取100人const num = 100;// 上次取值时间,秒级时间戳public $last_time;// 权重 machine=>weightpublic $machines = array('a' => 3, // 0.6'b' => 1, // 0.2'c' => 1 // 0.2 );// 占比public $proportion = array();// 用户队列public static $user_ids = array();public function __construct() {// 各机器的占比$total = 0;foreach ($this->machines as $machine => $weight) {$total += $weight;}$this->proportion['a'] = $this->machines['a'] / $total;$this->proportion['b'] = $this->machines['b'] / $total;$this->proportion['c'] = $this->machines['c'] / $total;}public function getUsers() {// 用户人数$cnt = count(self::$user_ids);$a_num = 0;$b_num = 0;$c_num = 0;if ($cnt >= self::num) { // 队列超过100人$a_num = round(self::num * $this->proportion['a']);$b_num = round(self::num * $this->proportion['b']);$c_num = $cnt - $a_num - $b_num;} else { // 队列不足100人$last_time = $this->last_time; // 上次访问时间while (true) {$current_time = $this->getMillisecond();if (($current_time - $last_time) >= 10) { // 当前时间和上一次取值时间超过10ms$a_num = round($cnt * $this->proportion['a']);$b_num = round($cnt * $this->proportion['b']);$c_num = $cnt - $a_num - $b_num;$this->last_time = self::getMillisecond(); // 更新访问时间break;}}}$a = array_splice(self::$user_ids, 0, $a_num);$b = array_splice(self::$user_ids, 0, $b_num);$c = array_splice(self::$user_ids, 0, $c_num);return array('a' => $a,'b' => $b,'c' => $c);}// 获取毫秒级时间戳public function getMillisecond() {list($t1, $t2) = explode(" ", microtime());return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);} }// 测试 $wrr = new WRR(); for ($i = 0; $i < 3; $i++) {// 模拟持续不断的用户请求$random = rand(10, 120);$user_ids = range(1, $random);WRR::$user_ids = $user_ids;$users = $wrr->getUsers();print_r($users); }
真实的算法比这个复杂多了,它需要考虑一点,就是来过的用户要保持原来分配的机器,除非原来的机器挂了。这样做的原因是缓存。很多基于内存的缓存,都是基于用户级别的,所以相同的用户保持同一台机器,有助于提升性能。
转载于:https://www.cnblogs.com/sunshineliulu/p/7506264.html
2017-5-5/PHP实现负载均衡的加权轮询相关推荐
- 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析
本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...
- 负载均衡之加权轮询算法
在介绍加权轮询算法(WeightedRound-Robin)之前,首先介绍一下轮询算法(Round-Robin). 一:轮询算法(Round-Robin) 轮询算法是最简单的一种负载均衡算法.它的原理 ...
- nginx负载均衡之加权轮询
当nginx作为代理服务器时,需要将客户端的请求转发给后端服务器进行处理,如果后端服务器有多台,那如何选择合适的后端服务器来处理当前请求,也就是本篇文章要介绍的内容.nginx尽可能的把请求分摊到各个 ...
- 负载均衡算法--加权轮询法(Weight Round Robin)
接上一篇博文:负载均衡算法–轮询法(Round Robin),本文讲解加权轮询算法. 加权轮询算法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同.给配置高.负载低 ...
- 负载策略_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略
什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...
- js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...
什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...
- Nginx负载均衡策略之轮询与加权轮询
轮询 是upstream模块负载均衡默认的策略.每个请求会按时间顺序逐个分配到不同的后端服务器.轮询不需要额外的配置. upstream backend{server 192.168.200.146: ...
- dubbo负载算法之加权轮询算法
轮询是一种无状态负载均衡算法,实现简单,适用于每台服务器性能相近的场景下.但现实情况下,我们并不能保证每台服务器性能均相近.如果我们将等量的请求分配给性能较差的服务器,这显然是不合理的.因此,这个时候 ...
- php管理智能dns,负载均衡之DNS轮询
域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服务器, ...
- 负载均衡与DNS轮询
负载均衡 load balance 负载均衡(Load Balancing)是一种将工作负载(Workload)分摊到多个计算资源(服务器.存储设备.网络设备等)上的技术,目的是提高系统的可用性.性能 ...
最新文章
- 如何使用Node.js获取当前脚本的路径?
- 下一个十年需要的五大IT技能
- 如何在Windows 10的地图应用程序中获取离线地图
- 计算特征矩阵及哈希值(含OpenCV代码)
- 微软关闭音乐服务器,微软关闭Zune音乐服务 Zune播放器变为MP3
- 不属于python标准库的是_下列哪项不是Python标准库中处理到程序中参量的模块?...
- “熊猫烧香”病毒的原理
- 最直白的编译原理-词法分析(清华-王书3版)
- 12306系统在2015年春运高峰期的稳定运行,采用了哪些具体技术?
- 锂电池电量百分比计算_电池soc是什么意思
- 在Qt中使用OpenGL(二)
- windows2008 R2安装LoadRunner 11提示WindowsInstaller存储空间不足解决方法
- c# 指定打开某个路径下的CMD_这招太厉害了,不用鼠标也可以打开指定文件
- (转)Android系统WAP上网设置
- Linux搭建socks 5代理服务器及使用
- 微信公众号前端开发,学习路线图必不可少
- 【C4D基础】导入图片、选择工具、线性切割、显示与渲染、旋转
- 网站ICP备案流程图解
- 解决POI导入EXCEL兼容问题
- VS、ReSharper 设置修改代码颜色、提高代码辨识度!附VS超实用快捷!