一、问题分析
问题:在性能测试过程中,发现用户管理平台在进行图片上传时,性能不佳。
分析:经过代码分析得知,主要的瓶颈是图片上传后,还需要根据图片组件所在页面模块容器进行一系列处理:图片生成缩略图,裁剪图片,加水印等,这些处理在高并发的情况下,会消耗大量cpu资源,导致系统响应速度非常慢。
旧的处理方式:
次控端调用前台接口进行上传图片后,前台程序先上传图片,接着,进行图片压缩等处理,然后再返回结果给次控端。
整个过程是串行的,次控端需要等待前台的结果后,再显示给用户。这个过程存在时间浪费,图片的处理可以提交到后台再进行处理,不需要马上处理。
因此,考虑采用Gearman进行异步任务处理。
新的处理方式:
次控端调用前台接口上传图片,前台保存要上传的图片后,提前返回信息给次控端,接着,调用Gearman增加一个任务,然后,由Gearman自动指派任务给服务器进行任务处理。采用新的处理方式后,次控端操作体验更加快捷。
二、Gearman详细介绍
简介:
官网:http://gearman.org/
Gearman是一个分布式的程序框架。Gearman提供了一个通用的应用程序,可以工作在更加适合处理这项任务的其他计算机或其他处理器上。它允许并行处理,载入平衡处理,而且可以在不同语言间进行调用。它可以应用于各种各样的应用场合。换句话说,它是一个进行分布式处理的强健系统。以下是关于Gearman的一些长处:
l 开源:完全开源,免费的。
l 多语言:有许多语言接口,而且支持的语言数量一直在增加。
l 灵活:不依赖于任何特定的设计。
l 快速:简单的协议和接口,可以减少现有应用程序的开销。
l 嵌入:轻量,可以以最小的代价引入到现有程序。
l 没有单点故障:具有较强的容错性。
框架:
(摘自官网)
Gearman Client:提供客户端调用,API可以是多种语言,目前在智能建站里应用的是PHP语言
Gearman Job Server:调度者,负责把来自客户端的请求分发到不同服务器或不同处理器上的Worker。
Gearman Worker:负责任务处理,并返回结果。
说明:应用程序通过Client API调用创建客户端请求,Job Server把请求分发到不同的worker上进行处理,Worker接收到请求并进行处理后返回结果。
以下是Gearman中三个基本模块的调用关系图:
(摘自官网)
Client与Worker是可以由不同的语言来写的,例如:Client由PHP来写,Worker由C语言来写。这样就可以很方便地把不同的语言编写的接口进行各自的接口封装。
不管是把Worker放到单独服务器,还是放到集群服务器,Worker都可以正常运行。
Client发送任务到Job Server中,由Job Server负责调度,Job Server会自动检测空闲的Worker,并发送任务到这个空闲的Worker,Worker进行任务处理。因此,Gearman框架可以实现资源负载平衡。
Gearman框架具有很强的扩展性。这个框架支持多核心CPU。如果Worker所在的服务器太繁忙,可以把服务器的CPU换成更多核心的CPU,如16核CPU,这样就可以在这台服务器上创建16个Worker实例来进行处理。当然,Gearman也支持服务器的扩展,可以很方便地扩展出更多的Worker服务器来处理请求。唯一需要做的事情就是:启动新服务器,安装好Worker程序,并修改配置即可。
如果服务器挂掉了,Gearman会如何处理呢?我们可以同时运行多个Job Server,Client和Worker连接到配置好的Job Server。如果这台Job Server出现故障,则配置到这台的Client和Worker会自动连接到另外一台可用的Job Server。这里建议大家,至少要有两台以上的Job Server,利用冗余来提高系统的容错性。
安装:
从官网上下载最新的软件包:gearman-0.6.0.tgz, gearmand-0.10.zip
gearman安装:gearmand-0.10.zip
安装过程如下(此安装过程会提示机器无法识别的字符,需要去除Makefile文件的这些字符后再编译):
# unzip gearmand-0.10.zip
# cd gearmand-0.10
# ./configure
# make
# make install
gearman的php扩展安装:
# tar –zxvf gearman-0.6.0.tgz
# cd gearman-0.6.0
# /usr/local/php/bin/phpize
# ./configure –enable-gearmand –with-php-config=/usr/local/php/bin/php-config
# make
# make install
修改/usr/local/php/lib/php.ini,并添加以下配置:
[gearman]
extension=”gearman.so”
启动过程:
# gearmand -L 127.0.0.1 -p 4730 -u root –d
应用示例:
Gearman的应用很简便,智能建站中的应用主要是根据图片处理请求,通过Gearman分发给相应的服务器进行处理,服务器进程根据具体任务要求,完成处理后,把结果返回给调用者。
worker简要代码如下:
<?php
require(‘../cavan-config.php’);
$worker= new GearmanWorker();//创建工作者对象
$worker->addServer();//创建服务端
$worker->addFunction(“compressPicture”, “ CompressPicture”);//添加函数
while ($worker->work());//执行工作
function CompressPicture ($job) //图片处理函数
{
……
}
?>
Client简要代码如下:
$client= new GearmanClient(); //创建客户端
$client->addServer(); //连接服务端
$json=”{\”width\”:” . $source_pic_w . “,\”height\”:” . $source_pic_h . “,\”file\”:\”" . $this->dir . $this->name. “” . “.” . $this->ext . “\”,\”name\”:\”" . $this->name. “_thumb” . “\”,\”type\”:1}”;//json数据
$client->do(“compressPicture “, $json); //调用服务端的图片处理函数