API给应用程序调用美狮美高梅官方网站:,但不

作者:美狮美高梅官方网站

工作中我们有时候会遇到比如需要同时发布数据到多个个服务器上,或者同时处理多个任务。可以使用PHP的curl_multi的方式并发处理请求,但是由于网络和数据以及各个服务器等等的一些情况导致这种并发处理的响应时间很慢,因为在并发请求的过程中还包括记录日志,处理数据等逻辑,等待处理结果并返回,所以也不能友好的满足后台操作的体验。

Linux中Gearman安装与使用,分布式消息队列(CentOS-6.5:gearmand-1.1.12)

通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用WebService的方式来处理此类集成问题,但不管采用何种风格的WebService,如RPC风格,或者REST风格,其本身都有一定的复杂性。相比之下,Gearman也能实现类似的作用,而且更简单易用。

现在有另外一种方案,利Gearman来实现并发的需求。通过Client将请求发送到Gearman的Jobs,在每个Work中来再来进行curl_multi和数据处理和日志等一些操作,同时用supervisor 来监控Gearman以及Works的进程,这样可以实现一个并行的多进程和负载均衡的方案。

1 Gearman简介

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。

Gearman可以做什么:

1.1 概况

Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。

 

Client:请求的发起者,可以是C,PHP,Perl,MySQL UDF等等。
Job:请求的调度者,用来负责协调把Client发出的请求转发给合适的Work。
Worker:请求的处理者,可以是C,PHP,Perl等等。

异步处理:图片处理,订单处理,批量邮件/通知之类的要求高CPU或内存的处理:大容量的数据处理,MapReduce运算,日志聚集,视频编码分布式和并行的处理定时处理:增量更新,数据复制限制速率的FIFO处理分布式的系统监控任务

1.2 组成

Gearman是一个分发任务的程序架构,由三部分组成:
1)Gearman client:提供gearman client API给应用程序调用。API可以使用C,PHP,PERL,MYSQL UDF等待呢个语言,它是请求的发起者。
2)Gearman job server:将客户端的请求分发到各个gearman worker的调度者,相当于中央控制器,但它不处理具体业务逻辑。
3)Gearman worker:提供gearman worker API给应用程序调用,具体负责客户端的请求,并将处理结果返回给客户端。

因为Client,Worker并不限制用一样的语言,所以有利于多语言多系统之间的集成。

Gearman工作原理:使用Gearman的应用通常有三部分组成:一个Client、一个Worker、一个 任务服务器。 Client的作用是提出一个 Job 任务 交给 Job Server 任务服务器。Job Server 会去寻找一个 合适的 Worker 来完成这项任务。Worker 执行由 Client 发送过来的 Job,并且将结果通过 Job Server 返回给 Client。Gearman 提供了 Client 和 Worker 的 API,利用这些API 应用可以同 Gearman Job Server来进行通信。Gearman 内部 Client 和 Worker 之间的通信都是通过 TCP 连接来进行的。

1.3 应用

Mogilefs的分布式文件系统的核心就是用gearman实现的。

这个软件的应用场景很多,比如视频网站的视频处理,分布式日志处理,电子邮件处理,文件同步处理,图片处理等等,只要是可以放开,不影响体验和响应的场 景,需要并行进行大量计算和处理的程序都是可以的。Yahoo在60或更多的服务器上使用gearman每天处理600万个作业。新闻聚合器digg构建 了一个相同规模的gearman网络,每天可处理400000个作业。

Gearman不但可以做为任务分发,还可以做为应用方面的负载均衡。可以让worker放在不同的一堆服务器上,也可以启动放在同一个cpu的多个核 上。比如,应用视频转换程序,不希望web服务器来处理视频格式转换,这时,可以在这一堆服务器上进行任务分发,在上面加载worker处理视频格式,对 外的web服务器就不会被视频转换过程影响。而且扩展方便,加一台服务器到任务调度中心,注册成worker即可,这时job server会在请求到来的时候,将请求发送给空闲的worker。还可以运行多个job server,组成ha架构,如果一个job server当掉了,client和worker会自动迁移到另一台job server上。

甚至我们通过增加更多的Worker,可以很方便的实现应用程序的分布式负载均衡架构。

Gearman可以将工作的负载分担到不同的机器中。

1.4 工作原理图

美狮美高梅官方网站 1

下面看看如何安装运行一个例子,条件所限,我们把Client,Job,Worker三个角色运行在一台服务器上:

安装:

2 运行过程

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。

Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。
Worker:请求的处理者,可以是 C,PHP,Perl 等等。
因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。
甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。

安装libevent:

复制代码 代码如下:rpm -ivh install -y gearmand

3 Gearman下载

1)官网

2)官网下载

3)官网使用向导

3)本次安装用到的所有软件下载地址(安装环境为CentOS-6.5)

wget
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable/
./configure --prefix=/usr
make && make install
/sbin/ldconfig
cd ../

启动:gearmand -d

4 Gearman安装

 

安装PHP Gearman扩展我都是用pcel来安装的,你也可以下载源码包来编译安装,但是记得要先安装libgearman和re2c,不然扩展编译安装会出错。

4.1 安装linux必备常用库

Linux中必备常用支持库的安装:

安装Gearman server and library:

pecl install gearman #不成功并提示版本问题可以试试 pecl install gearman-1.0.3,默认好像是1.1.2编译安装也很简单复制代码 代码如下:wget -c zxvf gearman-1.1.1.tgzphpize./configuremake && make installecho "extension=gearman.so" >> /etc/php.ini

4.2 安装gearmand依赖的库

# yum install -y boost-devel gperf libevent-devel libuuid-devel

wget
tar zxvf gearmand-0.9.tar.gz
cd gearmand-0.9
./configure
make
make install
/sbin/ldconfig
cd ../

PHP接口函数Gearman提供很多完善的扩展函数,包括GearmanClient,GearmanJob,GearmanTask,GearmanWorker,具体可以查看PHP官方手册.这是官方提供的Example其中的一个,相当与一个并发的分发任务处理的例子

4.3 安装gearmand服务

1)解压
# cd /usr/local/src/gearman
# tar xzf gearmand-1.1.12.tar.gz

2)配置
# cd gearmand-1.1.12
# ./configure

3)编译
# make

4)安装
# make install

5)安装成功图,输入

# gearman

美狮美高梅官方网站 2

安装Gearman PHP extension:

addServer();// initialize the results of our 3 "query results" here$userInfo = $friends = $posts = null;// This sets up what gearman will callback to as tasks are returned to us.// The $context helps us know which function is being returned so we can// handle it correctly.$client->setCompleteCallback(function(GearmanTask $task, $context) use (&$userInfo, &$friends, &$posts) {switch {case 'lookup_user':$userInfo = $task->data();break;case 'baconate':$friends = $task->data();break;case 'get_latest_posts_by':$posts = $task->data;// Here we queue up multiple tasks to be execute in *as much* parallelism as gearmand can give us$client->addTask('lookup_user', 'joe@joe.com', 'lookup_user');$client->addTask('baconate', 'joe@joe.com', 'baconate');$client->addTask('get_latest_posts_by', 'joe@joe.com', 'get_latest_posts_by');echo "Fetching...n";$start = microtime;$client->runTasks();$totaltime = number_format - $start, 2);echo "Got user info in: $totaltime seconds:n";var_dump($userInfo, $friends, $posts);

 

wget
tar zxvf gearman-0.5.0.tgz
cd gearman-0.5.0
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-gearman
make
make install
cd ../

gearman_work.php

5 安装php扩展

1)安装phpize
# yum install -y php-devel

2)解压
# cd /usr/local/src/gearman
# tar xzf gearman-1.1.2.tgz

3)配置
# cd gearman-1.1.2
# phpize
# ./configure

4)编译
# make

5)安装
# make install

6)安装成功

出现“Installing shared extensions: /usr/lib64/php/modules/”表示安装成功,/usr/lib64/php/modules/是gearman.so扩展的目录。如图

美狮美高梅官方网站 3

7)配置(加入扩展)
# vi /usr/local/php5/etc/php.ini
extension="gearman.so"

8)查配置是否成功
# vi test.php
print gearman_version() . "n";
?>

执行php test.php后,出现1.1.12表示安装成功
# php test.php
1.1.12

编辑php.ini配置文件加载相应模块并使之生效:

addServer();$worker->addFunction('lookup_user', function {// normally you'd so some very safe type checking and query binding to a database here.// ...and we're gonna fake that.sleep;return 'The user requested  . ') is 7 feet tall and awesome';});$worker->addFunction('baconate', function {sleep;return 'The user  . ') is 1 degree away from Kevin Bacon';});$worker->addFunction('get_latest_posts_by', function {sleep;return 'The user  . ') has no posts, sorry!';});while ;

6 Gearman启动停止

1) 创建日志/data0/logs/gearmand.log
# touch /data0/logs/gearmand.log

2)启动
# /usr/local/sbin/gearmand -d -u root -L 192.168.142.130 --log-file=/data0/logs/gearmand.log

3)参数详解
-b,--backlog= 储备的监听连接数量
-d, --daemon 后台运行
-f, --file-descriptors= 文件描述符的数量
-h, --help 帮助
-j, --job-retries= 在ob server移除不可用job之前运行的次数,防止不断运行导致其他可用worker崩溃。默认没有限制
-l, -log-file= 日志文件存放位置(默认记录最简单日志)
-L, --listen= 监听的IP,默认全部接受
-p, --port= 指定监听端口
-P, --pid-file= 指定进程ID写入位置
-r, --protocol= 加载协议模块
-q, --queue-type= 指定持久化队列
-t, --threads= 使用的I/9线程数量。默认为0
-u, --user= 启动后,切换到指定用户
-v, --verbose 增加一级详细程度
-V, --version 显示版本信息

4)查是否运行
# ps axu | grep gearmand

5)查看监听端口
# netstat -anp | grep 4730

6)停止,直接kill掉进程。
美狮美高梅官方网站 4

extension = "gearman.so"

我在3个终端中都执行了gearman_work.php

7 Gearman使用

启动Job:

ryan@ryan-lamp:~$ ps aux | grep gearman* | grep -v grepgearman 1504 0.0 0.1 60536 1264 ? Ssl 11:06 0:00 /usr/sbin/gearmand --pid-file=/var/run/gearman/gearmand.pid --user=gearman --daemon --log-file=/var/log/gearman-job-server/gearman.log --listen=127.0.0.1ryan 2992 0.0 0.8 43340 9036 pts/0 S+ 14:05 0:00 php /var/www/gearmand_work.phpryan 3713 0.0 0.8 43340 9036 pts/1 S+ 14:05 0:00 php /var/www/gearmand_work.phpryan 3715 0.0 0.8 43340 9036 pts/2 S+ 14:05 0:00 php /var/www/gearmand_work.php

7.1 创建Worker

创建worker.php,创建一个发送邮件的Worker端。代码如下

addServer('192.168.142.130', '4730');
$worker->addFunction("sendMail", "my_sendmail_function");
while ($worker->work());

function my_sendmail_function($job){

    // 接收数据
    $tmp = $job->workload();
    $receiveArr = unserialize($tmp);

    $from = $receiveArr['from'];
    $to = $receiveArr['to'];
    $subject = $receiveArr['subject'];
    $content = $receiveArr['content'];

    //发送邮件
    //....

    return $subject.' sendmail OK';
}

?>

gearmand -d

来查看下执行gearman_work.php的结果shell

7.2 启动Worker端

如果处理的数据量大,可以执行以下脚本多次,即启动多个Worker端。

# nohup php worker.php > tmp.txt &

如果当前用户是root的话,则需要这样操作:

本文由美狮美高梅官方网站发布,转载请注明来源

关键词: