1. 程式人生 > >分散式任務分發框架Gearman教程和PHP實現例項

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

1、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,可以很方便的實現應用程式的分散式負載均衡架構。

2、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

3、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.php

  1. <?php    
  2.   $clientnew GearmanClient();    
  3.   $client->addServer("127.0.0.1", 4730);    
  4.   print $client->do("title""Linvo");    
  5.   print "/n";    
  6. ?>    

worker.php
  1. <?php    
  2.   $workernew GearmanWorker();    
  3.   $worker->addServer("127.0.0.1", 4730);     
  4.   $worker->addFunction("title""title_function");    
  5.   while (true){
  6.      $worker->work();
  7.      if ($this->worker->returnCode() != GEARMAN_SUCCESS) {
    //Gearman 狀態錯誤 需要做日誌或異常處理
         }
  8.   }
  9.   function title_function($job)    
  10.   {    
  11.     $str = $job->workload();    
  12.     returnstrlen($str);    
  13.   }    
  14. ?>  

準備工作已經完畢,試驗開始
1、啟動job
gearmand -d

2、啟動worker
php -c /etc/php5/apache2/php.ini worker.php

3、啟動client(新開終端中開啟)
php -c /etc/php5/apache2/php.ini client.php

螢幕顯示字串的長度 “5”

這裡,有幾點需要說明一下:
1、這裡直接用php cli方式執行,新增-c引數是為了載入php.ini配置檔案,以載入gearman擴充套件
2、worker應該做成守護程序(CLI模式),可以開啟多個,這樣client發起的任務就會分發到各個worker分別來執行(自動負載均衡 )
這個例子由於太過簡單,即使開啟多個worker也無法看出效果,不過可以通過終止其中一個,可以看出系統自動切換到其他worker繼續正常執行
3、同理,client也是可以開啟多個的(模型請參考之前的那邊日誌)

4、同時,job也可以開啟多個,以避免單點故障