分布式任务分发框架Gearman教程和PHP实现实例
1、Gearman介紹和使用場(chǎng)景
Gearman是一個(gè)分發(fā)任務(wù)的程序框架,可以用在各種場(chǎng)合,與Hadoop相 比,Gearman更偏向于任務(wù)分發(fā)功能。它的任務(wù)分布非常簡(jiǎn)單,簡(jiǎn)單得可以只需要用腳本即可完成。Gearman最初用于LiveJournal的圖片 resize功能,由于圖片resize需要消耗大量計(jì)算資源,因此需要調(diào)度到后端多臺(tái)服務(wù)器執(zhí)行,完成任務(wù)之后返回前端再呈現(xiàn)到界面。
通常,多語(yǔ)言多系統(tǒng)之間的集成是個(gè)大問(wèn)題,一般來(lái)說(shuō),人們多半會(huì)采用WebService的方式來(lái)處理此類集成問(wèn)題,但不管采用何種風(fēng)格的WebService,如RPC風(fēng)格,或者REST風(fēng)格,其本身都有一定的復(fù)雜性。相比之下,Gearman也能實(shí)現(xiàn)類似的作用,而且更簡(jiǎn)單易用。
一個(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)镃lient,Worker并不限制用一樣的語(yǔ)言,所以有利于多語(yǔ)言多系統(tǒng)之間的集成。
甚至我們通過(guò)增加更多的Worker,可以很方便的實(shí)現(xiàn)應(yīng)用程序的分布式負(fù)載均衡架構(gòu)。
2、Gearman job分發(fā)服務(wù)端安裝
安裝Gearman server and library:
wget http://launchpad.net/gearmand/trunk/0.8/+download/gearmand-0.8.tar.gz
tar zxf gearmand-0.8.tar.gz
cd gearmand-0.8
./configure
sudo make
sudo make install
中間可能會(huì)遇到些問(wèn)題:
在./configure的時(shí)候,可能會(huì)出現(xiàn)缺少libraries的情況,一般是缺少libevent和uuid這兩個(gè)開發(fā)包,安裝之。。。
sudo apt-get install libevent-dev
sudo apt-get install uuid-dev
安裝完成后再重新配置安裝,安裝完成后執(zhí)行
sudo ldconfig
3、Gearman?Client和Worker端PHP實(shí)現(xiàn)實(shí)例
安裝Gearman PHP extension:
wget http://pecl.php.net/get/gearman-0.4.0.tgz
tar zxf gearman-0.4.0.tgz
cd gearman-0.4.0
phpize
./configure
sudo make
sudo make install
中間可能遇到的問(wèn)題:
找不到phpize命令,phpize在php開發(fā)包中,所以要先安裝php5-dev
sudo apt-get install php5-dev
安裝完后,就可以在源碼目錄中執(zhí)行phpize生成相關(guān)安裝配置信息,接著執(zhí)行后面的./configure等
make install后,它告訴你一個(gè)目錄,生成的gearman.so就在那里。
根據(jù)需要考到相應(yīng)PHP的擴(kuò)展目錄里(因?yàn)槲抑苯佑孟到y(tǒng)默認(rèn)安裝的php,它自動(dòng)生成就在擴(kuò)展中)
接下來(lái)修改php.ini以使php加載該模塊:
php --ini
看下php.ini在哪里,sudo vim 修改之,在其中加入
extension = "gearman.so"
然后,開始編寫client和worker端
client.php
[php]?view plaincopy
<?php????
??$client=?new?GearmanClient();????
??$client->addServer("127.0.0.1",?4730);????
??print?$client->do("title",?"Linvo");????
??print?"/n";????
?>????
worker.php
[php]?view plaincopy
<?php????
??$worker=?new?GearmanWorker();????
??$worker->addServer("127.0.0.1",?4730);?????
??$worker->addFunction("title",?"title_function");????
??while?(true){
? ? ?$worker->work();
? ? ?if ($this->worker->returnCode() != GEARMAN_SUCCESS) {
//Gearman 狀態(tài)錯(cuò)誤 需要做日志或異常處理
? ? ?}
? }
???????
??function?title_function($job)????
??{????
????$str?=?$job->workload();????
????return?strlen($str);????
??}????
?>??
準(zhǔn)備工作已經(jīng)完畢,試驗(yàn)開始
1、啟動(dòng)job
gearmand -d
2、啟動(dòng)worker
php -c /etc/php5/apache2/php.ini worker.php
3、啟動(dòng)client(新開終端中打開)
php -c /etc/php5/apache2/php.ini client.php
屏幕顯示字符串的長(zhǎng)度 “5”
這里,有幾點(diǎn)需要說(shuō)明一下:
1、這里直接用php cli方式運(yùn)行,添加-c參數(shù)是為了加載php.ini配置文件,以加載gearman擴(kuò)展
2、worker應(yīng)該做成守護(hù)進(jìn)程(CLI模式),可以開啟多個(gè),這樣client發(fā)起的任務(wù)就會(huì)分發(fā)到各個(gè)worker分別來(lái)執(zhí)行(自動(dòng)負(fù)載均衡 )
這個(gè)例子由于太過(guò)簡(jiǎn)單,即使開啟多個(gè)worker也無(wú)法看出效果,不過(guò)可以通過(guò)終止其中一個(gè),可以看出系統(tǒng)自動(dòng)切換到其他worker繼續(xù)正常執(zhí)行
3、同理,client也是可以開啟多個(gè)的(模型請(qǐng)參考之前的那邊日志)
4、同時(shí),job也可以開啟多個(gè),以避免單點(diǎn)故障
轉(zhuǎn)載于:https://blog.51cto.com/mengphilip/1619650
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的分布式任务分发框架Gearman教程和PHP实现实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jquery的$.each和$().ea
- 下一篇: Linux改变进程优先级的nice命令