Gearman是一个分发任务的程序框架,能够用在各类场合,与Hadoop相 比,Gearman更偏向于任务分发功能。它的任务分布很是简单,简单得能够只须要用脚本便可完成。Gearman最初用于LiveJournal的图片 resize功能,因为图片resize须要消耗大量计算资源,所以须要调度到后端多台服务器执行,完成任务以后返回前端再呈现到界面。php
一般,多语言多系统之间的集成是个大问题,通常来讲,人们多半会采用WebService的方式来处理此类集成问题,但无论采用何种风格的WebService,如RPC风格,或者REST风格,其自己都有必定的复杂性。相比之下,Gearman也能实现相似的做用,并且更简单易用。
一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
Client:请求的发起者,能够是C,PHP,Perl,MySQL UDF等等。
Job:请求的调度者,用来负责协调把Client发出的请求转发给合适的Work。
Worker:请求的处理者,能够是C,PHP,Perl等等。
由于Client,Worker并不限制用同样的语言,因此有利于多语言多系统之间的集成。
甚至咱们经过增长更多的Worker,能够很方便的实现应用程序的分布式负载均衡架构。
下面看看如何安装运行一个例子,条件所限,咱们把Client,Job,Worker三个角色运行在一台服务器上:
安装Gearman server and library:
wget http://launchpad.net/gearmand/trunk/0.8/+download/gearmand-0.8.tar.gz
tar zxf gearmand-0.8.tar.gz
cd gearmand-0.8
./configure
make
make install
安装Gearman PHP extension:
wget http://pecl.php.net/get/gearman-0.4.0.tgz
tar zxf gearman-0.4.0.tgz
cd gearman-0.4.0
phpize
./configure
make
make install
编辑php.ini配置文件加载相应模块并使之生效:
extension = "gearman.so"
启动Job:
gearmand -d
若是当前用户是root的话,则须要这样操做:
gearmand -d -u root
缺省会使用4730端口,下面会用到。
注意:若是找不到gearmand命令的路径,别忘了用whereis gearmand确认。
编写Worker:
worker.php文件内容以下:
<?php
$worker= new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('reverse', 'my_reverse_function');
while ($worker->work());
function my_reverse_function($job)
{
return strrev($job->workload());
}
?>
设置后台运行work:
php worker.php &
编写Client:
client.php文件内容以下:
<?php
$client= new GearmanClient();
$client->addServer('127.0.0.1', 4730);
echo $client->do('reverse', 'Hello World!'), "\n";
?>
运行client:
php client.php
输出:!dlroW olleH
出 于方便的考虑,Worker,Client使用的都是PHP,但这并不影响演示,实际应用中,你彻底能够经过Gearman集成不一样语言实现的 Worker,Client。或许此时你还想了解前面提到的负载均衡功能:很简单,只要增长多个Worker便可,你能够按照worker.php的样子 多写几个相似的文件,并设置不一样的返回值用以识别演示效果。而后依次启动这几个Worker文件,并屡次使用client.php去请求,你就会发现 Job会把Client请求转发给不一样的Worker。
命令行工具
若是你以为安装PHP之类的东西太麻烦的话,你也能够仅仅经过命令行工具来体验Gearman的功能:
启动Worker:gearman -w -f wc -- wc -l &
运行Client:gearman -f wc < /etc/passwd
前端
Gearman都能用来干什么?
Gearman 能够用在各个方面,最简单就是在不一样语言之间架起一座桥梁。好比你可能但愿你的php程序调用一个c 函数,那么用gearman就能够实现了,固然了实际你能够经过写一个php扩展来实现一样的工做,可是好比你要php调用java,perl,或者 python那么,Gearman就很是棒了。java
Gearman另外一个应用方面是负载分担,你 能够将worker放在不一样的服务器(或者一些 列服务器)上,好比你的php程序须要图片转换,可是不但愿本地服务器有太多的这样图片转换的进程,那么你能够创建一系列服务器,在上面加载worker 处理图片转换。这样你的web服务器将不受图片转换的影响,同时你获得了负载均衡的功能,由于job server会在请求到来的时候,将这个请求发给空闲的worker.一样对于多核的服务器,你能够在同一机器上建立一样数目的worker. 你可能担忧,job server处于一个中心,那么这会是一个单点的瓶颈,若是死了,会怎么样?对于这样的状况,你能够运行多个job server。这样若是一个job server down了,client和worker会自动迁移到另外一台job server上。python
Gearman范例在官网可找到:
slides:
http://gearman.org/index.php?id=presentations
use cases:
http://gearman.org/index.php?id=use_casesweb