Gearman and Perl

2010-12-31

简介

Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能。它的任务分布非常简单,简单得可以只需要用脚本即可完成。Gearman最初用于LiveJournal的图片 resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。 一个Gearman 请求的处理过程涉及三个角色: Client -> Job -> Worker。 Clinet,worker并不限制使用一样的语言,所以有利于多语言系统之间的集成。 Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。 Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。 Worker:请求的处理者,可以是 C,PHP,Perl 等等。

Gearman工作原理图:

[![](http://jiaxin.im/wp- content/uploads/2010/12/gearman_stack1.png)](http://jiaxin.im/wp- content/uploads/2010/12/gearman_stack1.png)

Gearman工作流程图

[![](http://jiaxin.im/wp- content/uploads/2010/12/gearman_flow.png)](http://jiaxin.im/wp- content/uploads/2010/12/gearman_flow.png)

Using Gearman in Perl:

install Job Server

wget http://launchpad.net/gearmand/trunk/0.14/+download/gearmand-0.14.tar.gz
tar xzvf gearmand-0.14.tar.gz
cd gearmand-0.14
./configure
make
make install

Example Worker in Perl:

#!/usr/bin/perl -w 

use strict;
use Gearman::Worker;
my $worker = Gearman::Worker->new();
$worker->job_servers('127.0.0.1:4730');
$worker->register_function( 'echo' => \&echo; ); #register function in server
$worker->work while 1;

sub echo
{
    my $jobs = shift;
    return $jobs->arg +1;
}

Example Client in Perl :

#!/usr/bin/perl -w

use strict;
use Gearman::Client;

my $client = Gearman::Client->new();

$client->job_servers('127.0.0.1:4730');

for (1..10000)
{
    my $result_ref = $client->do_task('echo', 1);
    print $$result_ref,"\n";
}