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 { ...
随机推荐
- 使用axios实现上传视频进度条
这是最终的效果图 先介绍一下axios的使用:中文的axios官方介绍 首先定义一个uploadTest方法,写在vue文件的methods里 该方法有三个参数,分别是参数,和两个回调函数,参数就是我 ...
- python,函数的基本用法
一.函数 函数的概念:对功能或者动作的封装可以帮我们把一段公共的代码提取出来 语法如下 def 函数名(形参): 函数体 函数名(实参) # 函数名() def yue(): print(" ...
- SpringBoot学习路线
网上也有很多github资源,都是自己学习Spring Boot时候,自己练的代码 虽然现在最新的版本用2.1.3.RELEASE版本,以前版本的demo运行可能会遇到错误.但是有总比没有要好,不是么 ...
- Qt532.容器QMap&QMultiMap
PS: QMap 一个Key 只能对应 一个Value (不是绝对的情况...内部都有 一个key对应多个value的机制) PS: QMultiMap 一个Key 可以对应 多个Value PS: ...
- OpenModelica Debug
assertion只触发一次 The gdb process has not responded to a command within 40 second(s).This could mean it ...
- TextView显示内容不全
今天开发遇到一个问题,发现TextView显示不全,很纳闷,看图: 正常情况应该是这个样子的: 造成这种情况的原因是: TextView被快速并且多次的设置内容值造成的. 我的场景: 我点击全选按钮, ...
- 基于Arcface Android平台的人脸识别实现
效果图 先上效果,让大家看看如何 现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软 ...
- 学习笔记27—python中numpy.ravel() 和 flatten()函数
简介 首先声明两者所要实现的功能是一致的(将多维数组降位一维).这点从两个单词的意也可以看出来,ravel(散开,解开),flatten(变平).两者的区别在于返回拷贝(copy)还是返回视图(vie ...
- Python Appium 开启Android测试之路
1.获取 Android app的Activity 打开终端cmd,先cd进入到刚才下载的“新浪.apk”目录下,然后使用aapt dump badging xxx.apk命令获取包内信息.注意,启动 ...
- 第 4 章 容器 - 029 - 限制容器的 Block IO
限制容器的 Block IO Block IO 是另一种可以限制容器使用的资源. Block IO 指的是磁盘的读写,docker 可通过设置权重.限制 bps 和 iops 的方式控制容器读写磁盘的 ...