任務分發系統gearman

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端代碼:

  1. <?php  

  2. # Reverse Client Code  

  3. $client= new GearmanClient();  

  4. $client->addServer();  

  5. print $client->do("reverse", "Hello World!");  

這段代碼很簡單,new個對象,添加Job Server(默認爲本地服務器),然後調用reverse功能並打印返回結果。

Worker端代碼:

  1. <?php  

  2. # Reverse Worker Code  

  3. $worker= new GearmanWorker();  

  4. $worker->addServer();  

  5. $worker->addFunction("reverse", "my_reverse_function");  

  6. while ($worker->work());  

  7. function my_reverse_function($job)  

  8. {  

  9. returnstrrev($job->workload());  

  10. }  

這段代碼也顯而易見地吐血。也可知道Gearman用起來是多麼簡單。

自己實現一個功能,通過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的負載均衡,新任務只會分發到空閒的機器上。

現在你可能會關心Job Server如果宕了怎麼辦。答案是可以啓動2-3臺Job Server。如果其中一臺無法正常工作了,請求將自動轉移動另外可用的Job Server。


4 舉個栗子


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章