2017-5-5/PHP实现负载均衡的加权轮询
<?php
// php实现负载均衡的加权轮询(WRR)
class WRR {
// 每次取100人
const num = 100;
// 上次取值时间,秒级时间戳
public $last_time;
// 权重 machine=>weight
public $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);
}
真实的算法比这个复杂多了,它需要考虑一点,就是来过的用户要保持原来分配的机器,除非原来的机器挂了。这样做的原因是缓存。很多基于内存的缓存,都是基于用户级别的,所以相同的用户保持同一台机器,有助于提升性能。
2017-5-5/PHP实现负载均衡的加权轮询的更多相关文章
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- 负载均衡算法: 简单轮询算法, 平滑加权轮询, 一致性hash算法, 随机轮询, 加权随机轮询, 最小活跃数算法(基于dubbo) java代码实现
直接上干活 /** * @version 1.0.0 * @@menu <p> * @date 2020/11/17 16:28 */ public class LoadBlance { ...
- 负载均衡之DNS轮询
大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服 ...
- 如何配置nginx负载均衡配置(轮询,权重,ip绑定)
集群是为了解决单节点无法服务高并发的情况,在集群中nginx是如何分配将来自客户端的请求 转发给服务器的 负载均衡可以提高网站的吞吐量(接受和响应),减轻单台服务器的压力 负载均衡提供了三种策略:轮询 ...
- [原]F5负载均衡示例:轮寻
/** * lihaibo 欢迎转载,请保留原地址 */ 规划: F5 1600 BIG-IP 内网 192.168.100.0 255.255.255.0 外网 10.50.20.0 255.255 ...
- nginx负载均衡 加权轮询和ip_hash
下面给大家总结了几种真正的nginx负载均衡的功能了,在此我们加了一个权重判断法就是根据nginx负载的状态实现分配访问用户到权重值少的机器了,具体配置如下. nginx为后端web服务器(apach ...
- Nginx 负载均衡-加权轮询策略剖析
本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更 ...
- Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 下篇
Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 上篇blog讲述了加权轮询算法的原理.以及负载均衡模块中使用的数据结构,接着我们来看看加权轮询算法的具 ...
- Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 上篇
Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 算法介绍 来看一个简单的Nginx负载均衡配置. http { upstream cluster { ...
随机推荐
- phpstorm软件配置端口问题
phpstorm默认的端口号是:63342 但是我装的apache服务器的默认端口是80 网上查找资料,都说可以加listen的端口,比如这里 #Listen 12.34.56.78:80 Lis ...
- Qt基础学习(3)-----滑动条之QSlider
//mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog> class QLineEdit; class Q ...
- hdu 5676 ztr loves lucky numbers 打表+二分
ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- Oracel中的NVL函数
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
- [osg]节点遍历nodevisitor浅析
参考:https://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html OSG中节点的访问使用的是一种访问器模式.一个典型的访问器涉及抽象访问者 ...
- vue-router两种模式的区别
参考文献:https://blog.csdn.net/lla520/article/details/77894985/ https://segmentfault.com/a/1190000015123 ...
- 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流
最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...
- Codeforces 374D - Inna and Sequence
374D - Inna and Sequence 思路: 树状数组+二分 因为被删的点最多N=1e6个,所以复杂度N*logN*logN 前段时间做过一道一样的题,这类题基本套路二分找没删除前的位置 ...
- js获取时间戳(new date()参数获取)
当获取截止到某一个时间点的时间戳时: 例如:到 2018-03-15 11:03:55 这个时间点的时间戳的时候 正确的写法: var data = new Date("2018/03/15 ...
- python实战小程序之购物车
# Author:南邮吴亦凡 # 商品列表 product_list = [ ('Iphone',5800), # 逗号一定不可以省略! ('Mac',4800), ('smartphone',400 ...