分布式的任務分發框架-Gearman


官方文檔:http://gearman.org/getting-started/ 安裝方法和示例都有,可以詳細看一下。

Gearman是一個分發任務的程序框架,可以用在各種場合,與Hadoop相比,Gearman更偏向於任務分發功能。它的任務分布非常簡單,簡單得可以只需要用腳本即可完成。Gearman最初用於LiveJournal的圖片resize功能,由於圖片resize需要消耗大量計算資源,因此需要調度到后端多台服務器執行,完成任務之后返回前端再呈現到界面。

Gearman可以做什么

  • 異步處理:圖片處理,訂單處理,批量郵件/通知之類的
  • 要求高CPU或內存的處理:大容量的數據處理,MapReduce運算,日志聚集,視頻編碼
  • 分布式和並行的處理
  • 定時處理:增量更新,數據復制
  • 限制速率的FIFO處理
  • 分布式的系統監控任務

 

1,安裝方法

#安裝gearman
yum install gearmand
#安裝libgearman
yum install libgearman-devel
#安裝gearman php擴展
pecl install gearman
#添加gearman.so到 php.ini
echo "extension=gearman.so" >> /etc/php.ini

 沒有pecl的話裝一下

yum install php-pear

如果pecl沒法安裝的話,可以直接下載源代碼,使用phpize編譯安裝

cd ~/software
wget http://pecl.php.net/get/gearman-1.1.2.tgz
cd gearman-1.1.2
phpize
./configure
make && make install

 

2,簡單使用示例:(我們使用Gearman來異步處理百度雲推送服務)

先看client.php注冊事件,client.php

<?php

// 創建Gearman對象
$client = new GearmanClient();
// addServer默認是localhost,端口默認是4730,如果不是默認的話可以調整
$client -> addServer();
// $client->addServer("192.168.0.0",4730);

echo "Sending job\n";

$username = "test";
$message = "message";
$data = array(
    "username" => $username,
    "message" => $message , 
);
// 注冊事件 以及 傳遞參數 , 多個參數使用json_encode轉換
// 任務可以阻塞式運行,還可以指定優先級 ;當然,也可以非阻塞(運行不等待結果)運行
// 可以參考php Gearman api文檔 : doNornal, doHigh, doLow,doBackground
$result = $client -> doBackground("testFunction", json_encode($data));
if ($result) {
    echo "Success: $result\n";
}

?>

 

再看worker的處理,其實就是注冊事件處理函數 , worker.php

<?php

$worker = new GearmanWorker();
$worker->addServer();

// 注冊事件及事件處理函數
$worker->addFunction("testFunction","handler");

// 運行worker
while ($worker->work());

function handler(GearmanJob $job) {
    $workload = json_decode($job->workload());
    echo "received: " . print_r($workload,1);
}


?>

可以命令行運行 php client.php , php worker.php ,這里啟動順序最好是先啟動worker,這樣事件可以得到及時處理;也可以先啟動client,事件會在Gearman中排隊,等待worker處理;

還可以啟動多個worker,Gearman會自動進行負載均衡,分配到不同的worker進行處理。

大家可以發掘更多應用場景...

 例如:通過Gearman實現MySQL到Redis的數據同步(異步復制)

 

gearman的監控:

可以使用supervisor,也可以使用gearman manager

使用supervisor監控gearman任務的例子見:

http://www.cnblogs.com/trying/p/4038285.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM