通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用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三个角色运行在一台服务器上:
安装libevent:
wget http://www.monkey.org/~provos/libevent-1.4.12-stable.tar.gz
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable/
./configure --prefix=/usr
make && make install
/sbin/ldconfig
cd ../
安装Gearman server and library:
wget http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz
tar zxvf gearmand-0.9.tar.gz
cd gearmand-0.9
./configure
make
make install
/sbin/ldconfig
cd ../
安装Gearman PHP extension:
wget http://pecl.php.net/get/gearman-0.5.0.tgz
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 ../
编辑php.ini配置文件加载相应模块并使之生效:
extension = "gearman.so"
启动Job:
gearmand -d
如果当前用户是root的话,则需要这样操作:
gearmand -d -u root
缺省会使用4730端口,下面会用到。
注意:如果找不到gearmand命令的路径,别忘了用whereis gearmand确认。
我们可以用 ps 指令來查看启动是否成功:
编写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 /var/www/html/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 /var/www/html/client.php
输出:!dlroW olleH
首先, PHP Gearman Extension 提供了一个名为GearmanClient
的类别,它可以让程序安排工作给 Job Server 。
而 addServer 方法表示要通知的是哪些
Job Server ,也就是说如果有多台 Job Server 的话,就可以透过 addServer 新增。
然后我们将要呼叫哪个 Worker 以及该 Worker 所需要的数据,利用 GearmanClient 的doBackground
方法传送过去。 doBackground 方法顾名思义就是在背景执行, Client 在丢出需求后就可以继续处理其他的程序。
=============
$client->doBackground('sendEmail', serialize($emailData));
echo "Email sending is done.\n";
============
doBackground 方法的第一个参数是告诉 Job Server 要执行哪个功能,而这个功能则是由 Worker 提供的;要注意是,这个参数只是识别用的,并不是真正的函式名称。而第二个参数是要传给 Worker 的数据,它必须是个字符串;因此如果要传送的是数组的话,我们就要用 PHP 的 serialize 函式来对这些资料做串行化。
出于方便的考虑,Worker,Client使用的都是PHP,但这并不影响演示,实际应用中,你完全可以通过Gearman集成不同语言实现的Worker,Client。或许此时你还想了解前面提到的负载均衡功能:很简单,只要增加多个Worker即可,你可以按照worker.php的样子多写几个类似的文件,并设置不同的返回值用以识别演示效果。然后依次启动这几个Worker文件,并多次使用client.php去请求,你就会发现Job会把Client请求转发给不同的Worker。
以守护进程启动
gearmand -L192.168.0.1 -p 4730 -u root -d
命令行工具
如果你觉得安装PHP之类的东西太麻烦的话,你也可以仅仅通过命令行工具来体验Gearman的功能:
启动Worker:gearman -w -f wc -- wc -l &
运行Client:gearman -f wc < /etc/passwd
具体可以参考官方文档,还有一些不错的PDF。
http://docs.php.net/manual/zh/book.gearman.php
http://www.ibm.com/developerworks/cn/opensource/os-php-gearman/index.html
也可以参考此文:http://www.jaceju.net/blog/archives/1211
分布式基础学习【一】 —— 分布式文件系统
http://www.cnblogs.com/duguguiyu/archive/2009/02/22/1396034.html
分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)
http://www.cnblogs.com/duguguiyu/archive/2009/02/28/1400278.html
淘宝网Hadoop专家
http://coderplay.javaeye.com/
分享到:
相关推荐
centos7.0安装mysql centos7.0安装mysql centos7.0安装mysql
Centos7.9安装zabbix6.0LTS版
CentOS7离线安装最新版本Podman-4.1.1版本。 当前容器的发展,对Docker逐渐远离,拥抱Containerd和Podman,目前Podman操作基本与Docker一致,让用户从Docker迁移至Podman成为了可能。 由于CentOS7.9默认安装的都是...
CentOS7安装Git
CentOS7安装指南
CentOS 7 安装 MySQL
centos6.7安装jdk1.8全部详细过程,若有疑问,欢迎联系!
centos 7.6安装流程下载详细安装过程,在网上看到特别好的教程,很好地解决了小白的问题,为此特意记录下来了。附件如下:centos 7.6安装流程.docx
在Centos7安装golang教程
Centos7.9安装配置vsftpd
CentOS 8 安装图解
Centos7.9安装部署Zabbix6,需要安装包的发邮箱,文件里面包含邮箱地址
3、CentOS 6.4 文本安装模式不支持自定义分区,建议使用图形安装模式安装; 4、CentOS 6.4 的系统安装方式分为:图形安装模式和文本安装模式; 5、CentOS 6.4 的系统运行方式分为:带图形界面、可以用鼠标操作的...
Centos离线安装iptables
此内容是本人整理的针对服务器的系统安装详细图文安装步骤。 对centos7.6的安装步骤进行逐步的拆解,标注。
centos的安装与下载,里面有下载地址和安装的图片教程。新手必备
centos5 cvs安装,一步一步教程,明了简单。还有用户管理说明。
CentOS是Linux发行版之一,相信不少朋友想知道CentOS系统安装配置的方法,下面小编给大家介绍下安装配置CentOS6.6的具体步骤,感兴趣的朋友不妨来了解下吧。
提供了在干净的centos7下安装gcc和g++的编译环境,同时给出了相关的包路径和安装步骤。按着步骤安装就可以完成了特定的环境了
centos7安装配置mysql5.7教程全