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 { ...
随机推荐
- Kubernetes工作流之Pods二
Init Containers This feature has exited beta in 1.6. Init Containers can be specified in the PodSpec ...
- Vue学习一:{{}}html模板使用方法
本文为博主原创,未经允许不得转载: 之前自学了vue,在项目中应用了vue,由于是第一次使用,感觉非常强大,使用也非常方便,趁有时间,总结一下vue学习过程中 各个指令的使用方法,只要掌握了vue的指 ...
- 2017秋 FZU SDN 课程作业汇总
课程: SDN课程上机作业:SDN上机作业 参考作业: deepYY SDN作业: SDN作业 faberry的博客:faberry peiqiaoWang的博客:peiqiaoWang 相关博客汇总 ...
- select2 使用方法总结
官网:http://select2.github.io/ 调用 <link href="~/Content/select2.min.css" rel="styles ...
- re模块与subprocess模块介绍
一:re模块 处理正则表达式的模块,正则表达式就是一些带有特殊含义的符号或者符号的组合. 作用:对字符串进行过滤,在一堆字符串中找到你所关心的内容,你就需要告诉计算机你的过滤的 规则是什么 ...
- JaveWeb 公司项目(4)----- Easyui的表单验证
前面三篇博文讲述的是界面的搭建和数据的传输,可以看出目前我做的这个小项目已经有了一个大体的雏形,剩下的就是细节部分的打磨和一些友好的人机交互设计,今天做的是表单的验证,作为初学者,着实花了一番功夫,所 ...
- python,函数的基本用法
一.函数 函数的概念:对功能或者动作的封装可以帮我们把一段公共的代码提取出来 语法如下 def 函数名(形参): 函数体 函数名(实参) # 函数名() def yue(): print(" ...
- C++.运行时类型判断_测试代码
ZC:C++ 编程思想——运行时类型识别 - 浅墨浓香 - 博客园.html(https://www.cnblogs.com/5iedu/articles/5585895.html) -------- ...
- 力扣(LeetCode)453. 最小移动次数使数组元素相等
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动 ...
- 《剑指offer》第四十三题(从1到n整数中1出现的次数)
// 面试题43:从1到n整数中1出现的次数 // 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如 // 输入12,从1到12这些整数中包含1 的数字有1,10,11和12 ...