用 Gearman 散發 PHP 應用程式的工作負載
來源:互聯網
上載者:User
用 Gearman 分發 PHP 應用程式的工作負載
http://www.ibm.com/developerworks/cn/opensource/os-php-gearman/
從 PHP 使用 Gearman
從 PHP 使用 Gearman 類似於之前的樣本,惟一的區別在於這裡是在 PHP 內建立 producer 和 consumer。每個 consumer 的工作均封裝在一個或多個 PHP 函數內。
清單 1 給出了用 PHP 編寫的一個 Gearman worker。將這些代碼儲存在一個名為 worker.php 的檔案中。
清單 1. Worker.php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("title", "title_function");
while ($worker->work());
function title_function($job)
{
return ucwords(strtolower($job->workload()));
}
?>
清單 2 給出了用 PHP 編寫的一個 producer,或 client。將此代碼儲存在一個名為 client.php 的檔案內。
清單 2. Client.php
$client= new GearmanClient();
$client->addServer();
print $client->do("title", "AlL THE World's a sTagE");
print "\n";
?>
現在,可以用如下的命令列串連客戶機與 worker 了:
$ php worker.php &
$ php client.php
All The World's A Stage
$ jobs
[3]+ Running php worker.php &
這個 worker 應用程式繼續運行,準備好服務另一個客戶機。
--------------------------------------------
回頁首
Gearman 的進階特性
在一個 Web 應用程式內可能有許多地方都會用到 Gearman。可以匯入大量資料、發送許多電子郵件、編碼視頻檔案、挖據資料並構建一個中央日誌設施 — 所有這些均不會影響網站的體驗和響應性。可以並行地處理資料。而且,由於 Gearman 協議是獨立於語言和平台的,所以您可以在解決方案中混合程式設計語言。比如,可以用 PHP 編寫一個 producer,用 C、Ruby 或其他任何支援 Gearman 庫的語言編寫 worker。
一個串連客戶機和 worker 的 Gearman 網路實際上可以使用任何您能想象得到的結構。很多配置能夠運行多個代理並將 worker 分配到許多機器上。負載平衡是隱式的:每個可操作的可用 worker(可能是每個 worker 主機具有多個 worker)從隊列中拉出作業。一個作業能夠同步或非同步運行並具有優先順序。
Gearman 的最新版本已經將系統特性擴充到了包含持久的作業隊列和用一個新協議來通過 HTTP 提交工作請求。對於前者,Gearman 工作隊列儲存在記憶體並在一個關係型資料庫記憶體有備份。這樣一來,如果 Gearman 精靈故障,它就可以在重啟後重新建立這個工作隊列。另一個最新的改良通過一個 memcached 叢集增加隊列持久性。memcached 儲存也依賴於記憶體,但被分散於幾個機器以避免單點故障。
Gearman 是一個剛剛起步卻很有實力的工作分發系統。據 Gearman 的作者 Eric Day 介紹,Yahoo! 在 60 或更多的伺服器上使用 Gearman 每天處理 600 萬個作業。新聞彙總器 Digg 也已構建了一個相同規模的 Gearman 網路,每天可處理 400,000 個作業。Gearman 的一個出色例子可以在 Narada 這個開源搜尋引擎(參見 參考資料)中找到。
Gearman 的未來版本將收集並報告統計資料、提供進階監視和緩衝作業結果等。為了跟蹤這個 Gearman 項目,可以訂閱它的 Google 組,或訪問 Freenode 上它的 IRC 頻道 #gearman。