【gearman,1】利用Gearman实现异步任务处理

来源:互联网 发布:大闹天宫武器进阶数据 编辑:程序博客网 时间:2024/06/01 22:41

利用Gearman实现异步任务处理

0774

一、问题分析

问题:在性能测试过程中,发现用户管理平台在进行图片上传时,性能不佳。

分析:经过代码分析得知,主要的瓶颈是图片上传后,还需要根据图片组件所在页面模块容器进行一系列处理:图片生成缩略图,裁剪图片,加水印等,这些处理在高并发的情况下,会消耗大量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); //调用服务端的图片处理函数

来源: <http://ptc.35.com/?p=654>

 

原创粉丝点击