1 Gearman是什麼
Gearman Job Server@http://gearman.org/。
Gearman 是一個任務分發系統,它提供了一個分發框架,能夠分發某類任務到更適合處理這類任務的服務器上去處理。並且,它支持任務並行處理、負載均衡以及多語言調用。它的適用範圍很廣,從高可用性的網站到透明的數據庫複製等。換句話說,它是一個強健的分佈式通信處理系統。下面是官網上列舉的優點:
- Open Source - 開源。Gearman 是遵循BSD開源規範的免費程序。
- Multi-language - 多語言支持。Gearman可以作爲多語言通信的接口。你可以用一種語言分發任務給另一種語言處理。比如php通過gearm分發任務給c。
- Flexible - 靈活性。使用它,不會讓你必須遵循任何特定的設計模式。對於分佈式的程序,你可以使用任何你想用的模式,比如Map/Reduce。
- Fast - 迅猛。Gearman 使用非常簡單的協議和接口,它是用C/C++實現的。
- Embeddable - 易用性。又快又輕量,所以它適用於所有規模的程序。只需要做很小的改動,就可將其整合入已存在的功能中。
- No single point of failure - 無單點故障。
- No limits on message size - 通信消息大小無限。單個通信消息最大達4G。要是還不滿足,gearman可以將消息分片傳輸。
- Worried about scaling? - Don't worry about it with Gearman. Craig's List, Tumblr, Yelp, Etsy,… discover what others have known for years.
2 Gearman如何工作
使用Gearman的程序通常包含三個部分:Client,Worker和Job server。Client是負責創建任務並將其發送至Job server。Job server會選擇一個合適的Worker,然後分發來處理這個任務。Worker負責處理任務並返回處理結果。Gearman系統提供了Client和Worker工作部分的API,使得客戶端可通過它們與Job server交互。所以你不需要處理網絡連接或者分發任務的工作。內部實現上,Client和Worker通過TCP socket與Job server通信。
瞭解更多的話,讓我們先看一個例子:
這個例子將從Client端發送一個字符串至Job Server,而Worker會負責將字符串翻轉並返回。
Client端代碼:
<?php
# Reverse Client Code
$client= new GearmanClient();
$client->addServer();
print $client->do("reverse", "Hello World!");
Worker端代碼:
<?php
# Reverse Worker Code
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work());
function my_reverse_function($job)
{
returnstrrev($job->workload());
}
自己實現一個功能,通過GearmanWorker::addFunction註冊,並用work()來實現監聽數據即可。
整個功能的流程就是這樣的:
正如你所見,Gearman實現了任務管理以及網絡通信,你只需要關注業務邏輯功能。你還可以創建後臺任務以及優先級任務隊列。更多內容可以參考Gearman文檔。
3 Gearman用在什麼地方
上面的例子好像費力不討好,N行代碼只出來一個“Hello World!”——還是倒着的。但是Gearman其實在很多情況很實用。
最簡單的一種是,你可以使用Gearman作爲不同程序語言之間的粘合劑。比如你希望你的php程序調用c的功能,那麼php可以作爲Client,c來提供Worker的處理功能,Job server和php/c API就可以作爲中間的接口。當然你可以把c做成php的擴展,但是你還有可能想使用php Client 和 python Worker,或者mysql Client 和 perl Worker。你可以混合使用任意支持的語言。
另外一種情況是很容易實現Worker的分佈式。比如php web程序需要處理圖片的轉換。這個轉換是很耗cpu的,直接在php中做會影響web服務器的QPS。這個時候可以將圖片的處理功能放到另外一組cpu強悍的機器上,從而實現物以至用。同時,Gearman也實現了Worker的負載均衡,新任務只會分發到空閒的機器上。
4 舉個栗子
gearman自己的栗子。http://gearman.org/use_cases
金山分佈式圖片處理。http://www.s135.com/dips/
perl+gearman+map/reduce。http://www.php-oa.com/2011/07/01/mapreduce-using-perl-and-gearman.html