分佈式任務分發框架Gearman教程和PHP實現實例

一、Gearman介紹和使用場景

Gearman是一個分發任務的程序框架,能夠用在各類場合,與Hadoop相 比,Gearman更偏向於任務分發功能。它的任務分佈很是簡單,簡單得能夠只須要用腳本便可完成。Gearman最初用於LiveJournal的圖片 resize功能,因爲圖片resize須要消耗大量計算資源,所以須要調度到後端多臺服務器執行,完成任務以後返回前端再呈現到界面。
一般,多語言多系統之間的集成是個大問題,通常來講,人們多半會採用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,能夠很方便的實現應用程序的分佈式負載均衡架構。
 

二、Gearman job分發服務端安裝

安裝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

中間可能會遇到些問題:
在./configure的時候,可能會出現缺乏libraries的狀況,通常是缺乏libevent和uuid這兩個開發包,安裝之。。。

sudo apt-get install libevent-dev
sudo apt-get install uuid-dev

安裝完成後再從新配置安裝,安裝完成後執行
sudo ldconfig
 

三、Gearman Client和Worker端PHP實現實例

安裝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

中間可能遇到的問題:
找不到phpize命令,phpize在php開發包中,因此要先安裝php5-dev

sudo apt-get install php5-dev

安裝完後,就能夠在源碼目錄中執行phpize生成相關安裝配置信息,接着執行後面的./configure等

make install後,它告訴你一個目錄,生成的gearman.so就在那裏。

根據須要考到相應PHP的擴展目錄裏(由於我直接用系統默認安裝的php,它自動生成就在擴展中)


接下來修改php.ini以使php加載該模塊:
php --ini
看下php.ini在哪裏,sudo vim 修改之,在其中加入
extension = "gearman.so"

而後,開始編寫client和worker端

client.phpphp

<?php    
  $client= new GearmanClient();    
  $client->addServer("127.0.0.1", 4730);    
  print $client->do("title", "Linvo");    
  print "/n";    
?> 

worker.php前端

<?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 狀態錯誤 須要作日誌或異常處理
     }
  }
       
  function title_function($job)    
  {    
    $str = $job->workload();    
    return strlen($str);    
  }    
?>

準備工做已經完畢,試驗開始
一、啓動job
gearmand -d

二、啓動worker
php -c /etc/php5/apache2/php.ini worker.php

三、啓動client(新開終端中打開)
php -c /etc/php5/apache2/php.ini client.php

屏幕顯示字符串的長度 「5」

這裏,有幾點須要說明一下:
一、這裏直接用php cli方式運行,添加-c參數是爲了加載php.ini配置文件,以加載gearman擴展
二、worker應該作成守護進程(CLI模式),能夠開啓多個,這樣client發起的任務就會分發到各個worker分別來執行(自動負載均衡 )
這個例子因爲太過簡單,即便開啓多個worker也沒法看出效果,不過能夠經過終止其中一個,能夠看出系統自動切換到其餘worker繼續正常執行
三、同理,client也是能夠開啓多個的(模型請參考以前的那邊日誌)apache

四、同時,job也能夠開啓多個,以免單點故障vim

相關文章
相關標籤/搜索