官网: http://gearman.org/
一篇文章:
利用Gearman实现异步任务处理
一、问题分析
问题:在性能测试过程中,发现用户管理平台在进行图片上传时,性能不佳。
分析:经过代码分析得知,主要的瓶颈是图片上传后,还需要根据图片组件所在页面模块容器进行一系列处理:图片生成缩略图,裁剪图片,加水印等,这些处理在高并发的情况下,会消耗大量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,利用冗余来提高系统的容错性。
安装:
Job Server (gearmand)
gearmand (C)
A job server written in C/C++ under the BSD license that contains all of the latest protocol additions. Development for this is very active, with threading, persistent queues, and pluggable protocols now supported. Replication and better statistics reporting are coming soon. This installs an executable calledgearmand
(usually in /usr/local/sbin). The C library, libgearman, is bundled in the same package.
- The latest version can be found on Launchpad.
./configure --prefix=/opt
安装报错:
checking whether the Boost::Program_Options library is available... yes
configure: error: Could not find a version of the library!
configure: error: could not find gperf
configure: error: Unable to find libuuid
安装后还是错误。
安装 gearmand
后,构建 PHP 扩展。您可以从 PECL 获取这个 tarball,也可以从 Github 复制该存储库。
$ wget http://pecl.php.net/get/gearman-0.6.0.tgz$ cd pecl-gearman## or#$ git clone git://github.com/php/pecl-gearman.git$ cd pecl-gearman |
有了这些代码后,就可以开始构建扩展了:
$ phpize$ ./configure$ make$ sudo make install |
./configure 后面可以设置php-config路径:
./configure --prefix=/opt --with-php-config=/usr/local/php/bin/php-config
还是报错:
configure: error: Please install libgearman
我们在安装gearman的时候,已经有libgearman了,但是在编译扩展的时候,却用额外安装的lib,在运行的时候,难免出现性能方面的问题
在./configure的时候指定下gearman的路径就是了,不必降低额外安装libgearman及降低版本(http://blog.csdn.net/aidenliu/article/details/7406390)
./configure --prefix=/opt --with-php-config=/usr/local/php/bin/php-config --with-gearman=/opt
这个 Gearman 守护程序通常被安装在 /usr/sbin。可以从命令行直接启动此守护程序,也可以将这个守护程序添加到启动配置中,以便在机器每次重启时就可以启动这个守护程序。
接下来,需要安装 Gearman 扩展。打开 php.ini 文件(可以通过 php --ini
命令快速找到这个文件),然后添加代码行 extension = gearman.so
:
$ php --iniLoaded Configuration File: /etc/php/php.ini$ vi /etc/php/php.ini ...extension = gearman.so |
保存此文件。要想验证扩展是否启用,请运行 php --info
,然后查找 Gearman:
$ php --info | grep "gearman support"gearmangearman support => enabledlibgearman version => 0.10 |
此外,还可以用一个 PHP 代码片段来验证构建和安装是否得当。将这个小应用程序保存到 verify_gearman.php:
<?php print gearman_version() . "\n";?> |
接下来,从命令行运行此程序:
$ php verify_gearman.php0.10 |
如果这个版本号与之前构建和安装的 Gearman 库的版本号相匹配,那么系统就已准备好了。
http://www.oschina.net/question/12_7687
安装参考:
http://blog.chinaunix.net/uid-27177626-id-4325909.html
http://www.php-oa.com/2010/09/05/perl-gearman-distributed.html
http://www.oschina.net/question/12_7687
http://maoyidao.iteye.com/blog/1402972
http://blog.csdn.net/aidenliu/article/details/7406390
http://www.cppblog.com/guojingjia2006/archive/2013/01/07/197076.html