首页 > 程序开发 > 软件开发 > 其他 > 正文
php实现一种简单的加权均衡算法
2017-02-17       个评论    来源:twqzy的专栏  
收藏    我要投稿

php实现一种简单的加权均衡算法:架构之路之spring+redis的集成在实际的工作中,需要用到负载均衡的地方很多,当然在很多时候都是使用硬件负载均衡设备或者现成的负载均衡软件。虽是如此,做成程序员还是有必要了解一些具体的实现方式。

有时候在程序中可能需要根据配置访问一些地址,但是因为是在程序内部,有时候请求量不大或者没有必要“兴师动众”,因此自己实现一个负载均衡调度,一方面可以解决自己的实际问题,另一方面可以让自己对这类实现了解的更加深入。

下面是自己用php实现的一个加权负载均衡算法。具体时间就是比较简单了,我们根据权重生成访问地址的数量,然后随机取其中一个值。这种实现在请求量小的时候,实际的权重设定并不是非常准确,但是如果请求量较大的时候效果还是比较明显的。代码很简单:

function getRandomUrl($configs) {
	$wConfigs = array();
	foreach ($configs as $idx => $cfg) {
		$weight = isset($cfg['weight']) ? intval($cfg['weight']) : 0;
		if ($weight > 0) {
			for ($i=0; $i<$weight; $i++) {
				$wConfigs[] = $cfg['url'];
			}
		}
	}
	// get a random integer as the index of wConfigs
	$idx = mt_rand(0, count($wConfigs) - 1);
	return $wConfigs[$idx];
}

方法实现了,我们写个小程序测试下:
$configs = array(
	array('url'=>'www.domain1.com', 'weight'=>2),
	array('url'=>'www.domain2.com', 'weight'=>4),
	array('url'=>'www.domain3.com', 'weight'=>1),
	array('url'=>'www.domain4.com', 'weight'=>3),
);

// run and get stat result
echo 'Start running, please wait for a while...', PHP_EOL;
$num = 10000000;
$stat = array();
$timeUse = 0;
for ($i=0; $i<$num; $i++) {
	$startTime = microtime(true);
	$url = getRandomUrl($configs);
	$endTime = microtime(true);
	$timeUse += $endTime - $startTime;
	if (!isset($stat[$url])) {
		$stat[$url] = 0;
	}
	$stat[$url] += 1;
}
echo PHP_EOL;

// output result
echo str_repeat('-*-*', 10), PHP_EOL;
echo 'Stat Result:', PHP_EOL;
foreach ($stat as $url => $times) {
	echo $url,"\t",$times,"\t",round(($times / $num * 100), 2),'%',PHP_EOL;
}
echo 'Average Time Cost: ', ($timeUse / $num),'s', PHP_EOL;
echo PHP_EOL;
上面程序的运行结果如下(注意:上面的程序运行的时间可能稍微长点,但是如果你把$num改小点,运行时间就会短些,改得太小意义就不大了):

Start running, please wait for a while...

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Stat Result:
www.domain2.com 3999278 39.99%
www.domain4.com 3000231 30%
www.domain1.com 2002104 20.02%
www.domain3.com 998387 9.98%
Average Time Cost: 5.3446655035019E-6s

点击复制链接 与好友分享!回本站首页
上一篇:架构之路之spring+redis的集成
下一篇:centos安装redis和php-redis扩展
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站