分佈式框架-Gearman

特點

Gearman是一個分佈式應用程序框架,支持同步、異步任務處理,負載均衡以及跨語言調用。通過Gearman,在WEB應用中可以將複雜的業務邏輯交給其它更適合的機器或進程,甚至不同的語言處理。Gearman是分佈式計算的神經中樞,它具有以下特性:

1.開源免費Gearman有一個很活躍的開源社區,提供了比較豐富的資源。

2.多語言支持Gearman提供了多語言接口支持,可以在客戶端(Client)使用一種語言提交任務,在工作站(worker)使用使用並一種語言完成該任務。

3.靈活性Gearman不綁定任務特定的設計模式,你可以很方便快速的將它集成到具體項目中。

4.快速Gearman使用簡單的協議以及經過優化的應用程序接口,服務器端使用C/C++編寫,資源開銷小。

5.可嵌入Gearman是輕量的,將它引入到項目中,並不需要太大的成本和開銷。

6.無單點故障問題Gearman支持JobServer冗餘和故障自動切換。

7.無消息大小限制問題Gearman可以支持單個消息4BG的大小,如果需要更大的消息傳送,Gearman可以將消息進行分塊處理。

工作模式

wKioL1MOARGiivxHAAFoh0nfLjo482.jpg



Gearman分佈式框架由三個部分組成:客戶端(Client)、工作站(Worker)以及任務服務器(JobServer)Client負責創建任務併發送到JobServer上,JobServer找到一個適合運行該任務的Worker來執行,Worker執行完成後將結果返回給JobServerJobServer再將結果返回給ClientGearman提供了完整的Client APIWorker API供應用程序與JobServer進行交互,因此,開發者無需考慮網絡和任務映射的問題。當然,在內部實現上,GearmanClient以及Worker JobServer使用的是TCP socket通信。

要解釋Gearman是如何工作的,可以來看一下官網上提供的一個簡單例子:對一個字符串進行倒序。該例子使用PHP編寫,當然,其它語言的調用也大同小異。

首先我們實現一段Client代碼,負責發送一個任務並等待任務結果,最後將結果打印出來。要完成這些,我們需要使用GearmanClient API發送數據以及一個與Worker端關聯好的函數名,在該例子中,使用的函數名是reverse。代碼如下:

<?php
$client = new GearmanClient();
$client->addServer();
print $client->doNormal("reverse", "hello, World!");

這些代碼初始化一個client類,並使用addServer配置所要用到的JobServer(不指定參數將使用127.0.0.1上指定的默認端口4730),並告訴client API使用"Hello, World!"運行reverse函數。就Gearman而言,函數名和參數完全是任意的,你可以發送適合應用程序的任意數據結構(包括文本和二進制)。這時,Gearmanclient API會將任務打包成一個Gearman協議數據包併發送到JobServer上,JobServer找到一個合適的worker來運行reverse函數。現在,該看看Worker端的代碼了:

<?php

$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", function($job) {
        returnstrrev($job->workload());
});
while($worker->work());

wKiom1MOATfykz8rAADdn_WiuDE639.jpg

這段代碼定義了一個函數,功能是拿到一個字符串並且返回該字符串的反序。它使用一個worker對象註冊一個被命名爲reverse的函數名(正好,這個名稱就是Cient指定的那個名稱),然後連接到與Client連接相同的JobServer上。當JobServer接收到需要運行的任務時,它會先查找worker的註冊列表,看看有誰註冊了叫reverse的函數名,然後將任務發給閒着的其中一個workerGearman中的worker API收到這個任務請求以後,運行它的reverse函數,然後將結果通過JobServer回傳給client.

正如你所看到的,client APIworker API(連同JobServer),會處理任務管理和網絡間通信,因此,你需要專注的僅僅是應用程序具體的業務邏輯部分。在Gearman中,你當然也可以用其它方式來運行任務,比如異步任務和分級任務。


適合做什麼

對於一些簡單的應用,比如實例中的反序字符串,顯然不適合將Gearman引入,但是對於一些很複雜的邏輯,而且是當前項目中的主語言無法很好完成的邏輯,這時Gearman的神威就發揮出來了。比如,PHP中,在Web Server處理請求時,需要對外請求很多接口,如果串行請求,顯然是浪費時間的,但是併發的請求,Web Server執行模式下又顯得力不從心,此時,可以將請求接口的任務交給後臺的WorkerWorker是在命令行模式下運行,可以使用PHP的多線程的併發性來做這事,當然了,也可以交給後臺的C++來做,就更完美了。Gearman本身可以認爲是不同語言之間的橋樑。


部署

Gearmanworker服務可以部署在不同的機器或機器集羣上,對任務進行分佈式處理。比如在WEB應用程序中需要做圖片轉換,而在Web Server上運行這樣的任務需要很長的處理時間,這時,你可以將圖片發送到另外機器上的worker進行處理,這樣就不會對WEB服務器的性能造成影響,同時,也可以達到負載均衡的效果。Worker池可以根據需要進行靈活部署。

wKioL1MOARKyfDepAADYucjqoNo249.jpg

爲了解決JobServer掛掉的問題,我們可以起2-3JobServer進行冗餘,並且所有的clientworker都配置到這些JobServer上,默認連接第一個可用的JobServer,如果其中一個掛了,另外一個JobServer可以繼續提供服務。JobServer可以同時輕易的處理數以百計的請求,因此JobServerWorker的部署量相比,不需要太多。上圖是展示了一個簡單的Gearman集羣構架。


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