因為近來在研究 Mogilefs 的分布文件系統,在讀讀這個的源碼,別外,為公司新設計了一個下載的系統,所以更加要深入研究一下,因為這個好東西是 Perl 寫的,真不容易,在讀這個的時間發現了幾個好東西,其中一個就是我現在要提到的 Gearman ,這是個分布的任務分發的框架。使用 Perl 寫的。後來用 C 重寫了其中一些部分。作者 Brad Fitzpatrick 大神開發的 Gearman, 他原來是 livejournal 的成員,設計最初也是用於LiveJournal的圖片 resize 功能,目前是 Google 的成員.
簡單的講, Gearman 就是一個用 Perl 寫的任務調度程序,它能提供一個服務器端進行任務調度,自己就不做其它任何事了。客戶端同時也提供了多種語言接口。Gearman 這個框架系統主要的工作是用來委派任務給其他機器,Mogilefs 的分布文件系統的核心就是用的這個。所以我們可以基於這個做一個自己的 Cluster 出來。
這個軟件的應用場景可以很多,比如 Web 2.0 的項目中,比如常用的視頻網站的視頻處理,分布式日誌處理,電子郵件處理,文件同步處理,圖片處理等等,只要是可以放開,不影響體驗和響應的場景,需要並行進行大量計算和處理的程序,都是可以的。不要因為 Gearman 是 Perl 寫的而認為通用性就不行,因為設計時就是獨立於語言和平臺的。所以客戶端可以是任何語言,象 Perl,PHP,python,Ruby之類。就算是 Shell 也行
Gearman 的作者 Eric Day 介紹,Yahoo! 在 60 或更多的服務器上使用 Gearman 每天處理 600 萬個作業。新聞聚合器 Digg 也已構建了一個相同規模的 Gearman 網絡,每天可處理 400,000 個作業。Gearman 的一個出色例子可以在 Narada 這個開源搜索引擎中找到。
Gearman 的架構
一個連接客戶機和 Workerer 連接在 Gearman 上組成一個網絡,也就是 Gearman 請求的處理過程涉及三個部分:Client -> Job -> Worker。這種實際網絡中是非常常用的。然後我們的應用提交程序來做客戶端的程度,提交任務。到了 Job Server 的隊列中,由 Worker 的服務器來取下來,並處理這個任務。
如圖
Gearman 怎麽樣工作
Gearman 不但可以做為任務分發,還可以做為應用方面是負載均衡,我們可以讓 Workerer 放在不同的一堆服務器上,也可以啟動放在同一個 CPU 的多個核上,比如,以我們常用的應用視頻轉換程序,但是不希望 Web 的服務器來處理視頻的格式處理的過程,這時,我們就可以在這一堆服務器上進行任務分發,在上面加載 Workerer 處理視頻格式處理和轉換。這樣對外的 web 服務器將不會被視頻轉換的過程影響,同時也能很多的讓所有服務器負載均衡的工作來處理,也非常方便擴展,加一個機器到任務調度中心,註冊成 Workerer 就行,這時 Job Server 會在請求到來的時候,將這個請求發給空閑的這個 Workerer. 另外你還可以運行多個Job Server。可以組成一個 HA 的架構,如果一個Job Server 的進程 down了,client 和 Workerer 會自動遷移到另一臺Job Server上。
如圖
從上面可以看出來 Worker 是可擴展的.如果你有需要 Worker 是可以運行任意多個的.
另外,我們對 Application 是不用過多在意的。同樣也是可以多個的。 Application 的客戶只有一個任務,就是加入任務到 Gearman 中來.
安裝 Gearman 的環境
安裝 Gearman::Server 的 Job Server ,如果沒有安裝 Client 就需要 Client 和 Worker 都裝上。如果不會使用 cpanm 的話,參考我以前寫過的 使用CPANMinus 來安裝Perl 模塊
cpanm Gearman::Server cpanm Gearman::Client cpanm Gearman::Worker
使用 Gearman 的功能
Gearman 總體上來看看,分 4 大步的功能.
1. 啟動 Gearman 的 Job Server 的服務
2. 使用 Worker 加入和註冊一個可以使用的功能
3. Worker 等待功能任務被運行
4. Client 連接啟動任務和提供任務需要的參數
Gearman 的 Job Server 調度程序的使用
(1. 啟動Job:
gearmand -d -L 127.0.0.1 -p 7003
-d deamon
-L 監聽 IP
-p 端口(2. Gearman 的狀態查看
telnet localhost 7003 status
# telnet 127.0.0.1 7003 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. status convertVideo 0 0 1 echo 1 0 0
可以見到如上的輸出,分 4 個部分.
已知註冊的任務, 正在運行的任務, 隊列中的任務,可用的 Worker.
如 convertVideo 0 0 1 .這個部分,註冊的任務名為 convertVideo,0 個正常在運行,隊列為空,有一個可用的 Worker.
Gearman::Worker 的基本語法和使用
這個沒有什麽好講的,連接到主 Gearman 調度服務器。然後是通過內部的 register_function 函數來註冊一個功能,到 Gearman 的主調度服務器上去。好讓調度服務器知道這個 Worker 能處理的任務是什麽。
#!/usr/bin/perl use strict; use warnings; use Gearman::Worker; my $worker = Gearman::Worker->new; $worker->job_servers('127.0.0.1'); # Worker 註冊可以使用的功能,如果視頻轉換... $worker->register_function( convertVideo => \&convertVideo ); # 等待連接的任務 $worker->work while 1; sub convertVideo{ my $job = shift; # TODO 做你要實現的事情,任務 return $job->arg; }
Gearman::Client 的基本語法和使用
Gearman::Client 工作分同步和異步二種,默認我打開的是異步的功能,註掉的部分打開就是使用同步調用任務。
#!/usr/bin/perl use strict; use warnings; use Gearman::Client; my $client = Gearman::Client->new; $client->job_servers('127.0.0.1'); # 設置異步任務 my $tasks = $client->new_task_set; $tasks->add_task( # 開始任務 convertVideo => 'new.flv', # 註冊回調函數 { on_complete => \&complete }, ); # 等待任務結束 $tasks->wait; sub complete{ my $result = shift; print $$result ."\n"; } # 設置同步任務 #my $resultRef = $client->do_task( "convertVideo", "new.flv" ); #print "$$resultRef\n"; #$client->dispatch_background( "convertVideo","new.flv" );
相關文檔 http://search.cpan.org/~dormando/Gearman-Server-1.11/
Tags: Gearman 處理 這個 可以 一個 因為
文章來源: