Gearman 的安裝和使用
官網(wǎng)地址:http://gearman.org/
介紹
Gearman是一個(gè)用來(lái)把工作委派給其他機(jī)器帜矾、分布式的調(diào)用更適合做某項(xiàng)工作的機(jī)器、并發(fā)的做某項(xiàng)工作在多個(gè)調(diào)用間做負(fù)載均衡屑柔、或用來(lái)在調(diào)用其它語(yǔ)言的函數(shù)的系統(tǒng)屡萤。
Gearman提供了一種通用的程序框架來(lái)將你的任務(wù)分發(fā)到不同的機(jī)器或者不同的進(jìn)程當(dāng)中。它提供了你進(jìn)行并行工作的能力掸宛、負(fù)載均衡處理的能力死陆,以及在不同程序語(yǔ)言之間溝通的能力。Gearman能夠應(yīng)用的領(lǐng)域非常廣泛唧瘾,從高可用的網(wǎng)站到數(shù)據(jù)庫(kù)的復(fù)制任務(wù)措译。總之饰序,Gearman就是負(fù)責(zé)分發(fā)處理的中樞系統(tǒng)领虹,它的優(yōu)點(diǎn)包括:
開(kāi)源:Gearman免費(fèi)并且開(kāi)源而且有一個(gè)非常活躍的開(kāi)源社區(qū)求豫,如果你想來(lái)做一些貢獻(xiàn)塌衰,請(qǐng)點(diǎn)擊 。
多語(yǔ)言支持:Gearman支持的語(yǔ)言種類(lèi)非常豐富蝠嘉。讓我們能夠用一種語(yǔ)言來(lái)編寫(xiě)Worker程序猾蒂,但是用另外一種語(yǔ)言編寫(xiě)Client程序。
靈活:不必拘泥于固定的形式是晨。您可以采用你希望的任何形式肚菠,例如 Map/Reduce。
快速:Gearman的協(xié)議非常簡(jiǎn)單罩缴,并且有一個(gè)用C語(yǔ)言實(shí)現(xiàn)的蚊逢,經(jīng)過(guò)優(yōu)化的服務(wù)器层扶,保證應(yīng)用的負(fù)載在非常低的水平。
可植入:因?yàn)镚earman非常小巧烙荷、靈活镜会。因此您可以將他置入到現(xiàn)有的任何系統(tǒng)中。
沒(méi)有單點(diǎn):Gearman不僅可以幫助擴(kuò)展系統(tǒng)终抽,同樣可以避免系統(tǒng)的失敗戳表。
運(yùn)行過(guò)程:
一個(gè)Gearman請(qǐng)求的處理過(guò)程涉及三個(gè)角色:Client -> Job -> Worker。
Client:請(qǐng)求的發(fā)起者昼伴,可以是 C匾旭,PHP,Perl圃郊,MySQL UDF 等等价涝。
Job:請(qǐng)求的調(diào)度者,用來(lái)負(fù)責(zé)協(xié)調(diào)把 Client 發(fā)出的請(qǐng)求轉(zhuǎn)發(fā)給合適的 Work持舆。
Worker:請(qǐng)求的處理者色瘩,可以是 C,PHP逸寓,Perl 等等居兆。
因?yàn)?Client,Worker 并不限制用一樣的語(yǔ)言竹伸,所以有利于多語(yǔ)言多系統(tǒng)之間的集成史辙。
甚至我們通過(guò)增加更多的 Worker,可以很方便的實(shí)現(xiàn)應(yīng)用程序的分布式負(fù)載均衡架構(gòu)佩伤。
Gearman的工作原理:
使用Gearman的應(yīng)用通常有三部分組成:一個(gè)Client聊倔、一個(gè)Worker、一個(gè) 任務(wù)服務(wù)器生巡。 Client的作用是提出一個(gè) Job 任務(wù) 交給 Job Server 任務(wù)服務(wù)器耙蔑。Job Server 會(huì)去尋找一個(gè) 合適的 Worker 來(lái)完成這項(xiàng)任務(wù)。Worker 執(zhí)行由 Client 發(fā)送過(guò)來(lái)的 Job孤荣,并且將結(jié)果通過(guò) Job Server 返回給 Client甸陌。Gearman 提供了 Client 和 Worker 的 API,利用這些API 應(yīng)用可以同 Gearman Job Server來(lái)進(jìn)行通信盐股。Gearman 內(nèi)部 Client 和 Worker 之間的通信都是通過(guò) TCP 連接來(lái)進(jìn)行的钱豁。工作的流程如下圖所示:
Gearman的用處:
Gearman首先提供了一個(gè)多語(yǔ)言通訊的接口,當(dāng)然還有比這個(gè)更簡(jiǎn)單有效的辦法疯汁。Gearman可以將工作的負(fù)載分擔(dān)到不同的機(jī)器中牲尺,如下圖所示:
Job Server 可以開(kāi)啟多個(gè)實(shí)例,這樣在其中一個(gè)發(fā)生故障的時(shí)候,可以 Failover 到其他的機(jī)器上谤碳。同時(shí) Worker 也可以是多個(gè)實(shí)例進(jìn)行運(yùn)行溃卡,因?yàn)楫?dāng)前的服務(wù)器很多都是多核的。
安裝
yum 安裝
安裝gearmand
$ sudo yum install gearmand
安裝php擴(kuò)展
$ sudo yum install --enablerepo=remi --enablerepo=remi-php56 php-pecl-gearman
查看擴(kuò)展是否安裝成功
$ php -m | grep gearman
gearman
源碼安裝
安裝gearmand
$ wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz
$ tar xvzf gearmand-1.1.12.tar.gz
$ cd gearmand-1.1.12
$ ./configure
$ make
$ sudo make install
安裝php擴(kuò)展
$ wget http://pecl.php.net/get/gearman-1.1.2.tgz
$ tar xvzf gearman-1.1.2.tgz
$ cd gearman-1.1.2
$ phpize
$ ./configure
$ make
$ make install
手動(dòng)添加配置
$ php --ini //Loaded Configuration File: /etc/php/php.ini
$ vi /etc/php/php.ini
...
extension = gearman.so
使用
相關(guān)代碼:
worker.php
<?php
$worker= new GearmanWorker();
$worker->addServer("127.0.0.1", 4730);
$worker->addFunction("title", "title_function");
while ($worker->work());
function title_function($job){
return "你請(qǐng)求的數(shù)據(jù):" . $job->workload() . " 請(qǐng)求時(shí)間:" . date('Y-m-d H:i:s');
//return ucwords(strtolower($job->workload()));
}
?>
client.php
<?php
$client= new GearmanClient();
$client->addServer("127.0.0.1", 4730);
print $client->do("title", json_encode(
[
'username'=>'jack',
'email'=>'jack@foxmail.com',
]
));
print "\n";
?>
測(cè)試:
啟動(dòng)服務(wù)
$ sudo gearmand -d
啟動(dòng)worker
$ php worker.php &
[1] 15135
啟動(dòng)client
$ php client.php
你請(qǐng)求的數(shù)據(jù):{"username":"jack","email":"jack@foxmail.com"} 請(qǐng)求時(shí)間:2017-07-10 23:25:30
參考:
https://segmentfault.com/a/1190000000494087
https://www.ibm.com/developerworks/cn/opensource/os-php-gearman/
http://gearman.org/getting-started/#client
http://php.net/manual/zh/book.gearman.php