Gearman介紹php
Gearman是一個用來把工做委派給其餘機器、分佈式的調用更適合作某項工做的機器、併發的作某項工做在多個調用間作負載均衡、或用來在調用其它語言的函數的系統。web
一般,多語言多系統之間的集成是個大問題,通常來講,人們多半會採用 WebService 的方式來處理此類集成問題,但無論採用何種風格的WebService,如 RPC 風格,或者 REST 風格,其自己都有必定的複雜性。相比之下,Gearman 也能實現相似的做用,並且更簡單易用。算法
對於分佈式網絡環境或者有大量任務的應用,咱們須要將任務在不一樣的服務器之間進行分佈,這個時候正好是Gearman發揮實力的時候。雖然咱們也可使用MQ隊列再加一些本身實現的調度算法來將任務進行分發,可是既然已經有了成熟的產品,爲何不使用下呢。
數據庫
Gearman提供了一種通用的程序框架來將你的任務分發到不一樣的機器或者不一樣的進程當中。它提供了你進行並行工做的能力、負載均衡處理的能力,以及在不一樣程序語言之間溝通的能力。Gearman可以應用的領域很是普遍,從高可用的網站到數據庫的複製任務。總之,Gearman就是負責分發處理的中樞系統,它的優勢包括:
開源:Gearman免費而且開源並且有一個很是活躍的開源社區,若是你想來作一些貢獻,請點擊 。
多語言支持:Gearman支持的語言種類很是豐富。讓咱們可以用一種語言來編寫Worker程序,可是用另一種語言編寫Client程序。
靈活:沒必要拘泥於固定的形式。您能夠採用你但願的任何形式,例如 Map/Reduce。
快速:Gearman的協議很是簡單,而且有一個用C語言實現的,通過優化的服務器,保證應用的負載在很是低的水平。
可植入:由於Gearman很是小巧、靈活。所以您能夠將他置入到現有的任何系統中。
沒有單點:Gearman不只能夠幫助擴展系統,一樣能夠避免系統的失敗。
小程序
Gearman架構和工做原理服務器
使用Gearman的應用一般有三部分組成:一個Client、一個Worker、一個任務服務器。 Client的做用是提出一個 Job 任務 交給 Job Server 任務服務器。Job Server 會去尋找一個 合適的 Worker 來完成這項任務。Worker 執行由 Client 發送過來的 Job,而且將結果經過 Job Server 返回給 Client。Gearman 提供了 Client 和 Worker 的 API,利用這些API 應用能夠同 Gearman Job Server來進行通訊。Gearman 內部 Client 和 Worker 之間的通訊都是經過 TCP 鏈接來進行的。工做的流程以下圖所示:網絡
一個Gearman請求的處理過程涉及三個角色:Client -> Job -> Worker。
Gearman client:提供gearman client API給應用程序調用。API可使用C,PHP,PERL,MYSQL UDF等待呢個語言,它是請求的發起者。
Gearman job server:將客戶端的請求分發到各個gearman worker的調度者,至關於中央控制器,但它不處理具體業務邏輯。
Gearman worker:提供gearman worker API給應用程序調用,具體負責客戶端的請求,並將處理結果返回給客戶端。數據結構
由於 Client,Worker 並不限制用同樣的語言,因此有利於多語言多系統之間的集成。
甚至咱們經過增長更多的 Worker,能夠很方便的實現應用程序的分佈式負載均衡架構。架構
Gearman基本使用方法併發
Gearman首先提供了一個多語言通信的接口,固然還有比這個更簡單有效的辦法。Gearman能夠將工做的負載分擔到不一樣的機器中,以下圖所示:
Gearman不但能夠作爲任務分發,還能夠作爲應用方面的負載均衡。可讓worker放在不一樣的一堆服務器上,也能夠啓動放在同一個cpu的多個核上。好比,應用視頻轉換程序,不但願web服務器來處理視頻格式轉換,這時,能夠在這一堆服務器上進行任務分發,在上面加載worker處理視頻格式,對外的web服務器就不會被視頻轉換過程影響。並且擴展方便,加一臺服務器到任務調度中心,註冊成worker便可,這時job server會在請求到來的時候,將請求發送給空閒的worker。
Job Server 能夠開啓多個實例,組成HA架構,這樣在其中一個發生故障的時候,client和worker會自動 Failover 到其餘的機器上。
簡單來說,就是下面的流程
如圖
從上面能夠看出來 Worker 是可擴展的.若是你有須要 Worker 是能夠運行任意多個的.
另外,咱們對 Application 是不用過多在乎的.一樣也是能夠多個的. Application 的客戶只有一個任務,就是加入任務到 Gearman 中來.
下面是一個例子,能夠詳細解釋Gearman的工做方式。 下面是一個PHP的反轉字符串的例子。
咱們首先寫一個client,它負責發送job並等待處理結果,拿到結果後,直接打印出來。這個小程序,使用了Gearman的client API, 把function name和參數一同發送出去,function name是reverse。(省略了錯誤處理):
// Reverse Client Code
$client= new GearmanClient();
$client->addServer();
print $client->do("reverse", "Hello World!");
上邊的代碼初始化了一個client類,添加了一個job server(沒有參數表示使用127.0.0.1的默認端口),而後告知API執行"reverse" function, workload爲 "Hello world". Function name 和 參數不受限制, 因此發送任意的數據結構。從這一點來看,Gearman client API會把job打包爲一個Gearman協議數據包,而後發送給job server, 找到一個可以執行reverse的worker。
如今咱們來看下worker的代碼:
# Reverse Worker Code
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work());
function my_reverse_function($job)
{
return strrev($job->workload());
}
以上代碼定義了一個function 「my_reverse_function」,輸入一個字符串,輸出反轉的字符串。咱們把他註冊給GearmanWorker的實例,註冊的 function name 爲"reverse",以後它會被鏈接到job server(與以前的client鏈接的是同一個)。 當job server收到執行請求時,會查找worker list,看誰註冊了"reverse"function, 而後把請求轉發給一個閒置的worker. Gearman worker API會獲取這個請求,而後調用註冊過的php函數"my_reverse_function",php函數處理的結果會經過server返給客戶端。
如你所見,client和worker APIs 處理job管理和網絡通訊,因此咱們能把精力集中到應用自己。這裏有幾種不一樣的執行Gearman job的方法,包括後臺異步處理和任務排序。
上邊反轉的例子看起來花了很大的力氣去執行了一個function, 但這實際上是有意義的。 一方面,gearman可以讓你可以在client和worker使用不一樣的語言。若是你但願用PHP應用調用C的實現,你能夠用PHP client API和C的worker API,而後搞一個job server放在中間。固然,跨語言調用有不少解決方案(好比用C寫PHP擴展)。
咱們再舉一個例子,咱們須要用PHP client去調Python的worker,或者用MySQL client和Perl worker...總之能很容易地實現混搭。若是你心愛的語言尚未API支持,能夠參與項目,你或者Gearman的開發者能夠很簡單的搞一個C lib的封裝。
「Gearman頗有用」的第二個理由是,咱們能夠把worker扔到其餘機器(或集羣)上來幹活。好比你的PHP web 應用須要作大量的圖片處理,但web機沒有足夠的資源來處理,這樣咱們能夠搞一臺單獨的機器來作圖片處理,這樣,圖片處理的負擔就不會對web服務器的執 行效率和響應速度形成影響。另外,這樣作咱們還可以實現負載均衡,由於job server老是把jobs發給閒置worker.在多核系統上,它的實現也很簡單:若是你有一臺16核的機器,開啓16個worker就可(也許能夠開 更多)。添加新機器也是無縫的,在新機器上部署worker 代碼,而後把它們連到job server便可。
如今,你可能會問,job server掛了怎麼辦? 咱們能夠起多個job server,讓clients和workers鏈接到配置好的可用的第一個job server. 若是一個job server掛掉,clients和workers自動找其餘的可用的job server。開2-3個job server是不錯的選擇。上圖是一個簡單的集羣的樣子。
這樣子,你就能夠方便地擴張clients和workers了。job server能夠輕鬆抗住上百個clients和workers同時鏈接。