Gearman vs Beanstalkd

在Web應用程序中大部分內容都與表示有關但它的價值與競爭優勢卻可能體現在若干專有服務或算法方面。如果這類處理會消耗大量時間和資源,將其分離出來以異步的方式執行是比較常見的做法。要完成這樣的任務,需要一個消息隊列來進行管理。Gearman和Beanstalkd是比較常用的兩個,這裏對這兩個隊列進行一個對比。

 

Gearman:

Gearman是一個分發任務的程序框架來將你的任務分發到不同的機器或者不同的進程當中。它提供了並行工作的能力、負載均衡處理的能力,以及在不同程序語言之間溝通的能力,可以用在各種場合,與Hadoop相比,Gearman更偏向於任務分發功能。它的任務分佈非常簡單,簡單得可以只需要用腳本即可完成。

 

工作原理:

使用Gearman的應用通常有三部分組成:一個client、一個worker、一個jobserver。 Client的作用是提出一個Job任務交給job server。job server會去尋找一個合適的worker 來完成這項任務。wrker執行由client發送過來的job,並且將結果通過job server 返回給client。Gearman 提供了client和worker的API,利用這些API 應用可以同Gearman job server來進行通信。Gearman內部client和worker之間的通信都是通過TCP連接來進行的。工作的流程如下圖1。

圖1、Gearman的工作流程圖

Gearman可以將工作的負載分擔到不同的機器中,job server可以開啓多個實例,這樣在其中一個發生故障的時候,可以failover到其他的機器上。同樣,對於多核服務器可以同時創建多個worker實例進行運行,如圖2所示。

圖2、Gearman集羣

 

優點:

開源:Gearman免費並且開源而且有一個非常活躍的開源社區,如果你想來做一些貢獻,請點擊。

多語言支持:Gearman支持的語言種類非常豐富。讓我們能夠用一種語言來編寫Worker程序,但是用另外一種語言編寫Client程序。

靈活:不必拘泥於固定的形式。您可以採用你希望的任何形式,例如Map/Reduce

快速:Gearman的協議非常簡單,並且有一個用C語言實現的,經過優化的服務器,保證應用的負載在非常低的水平。

可植入:因爲Gearman非常小巧、靈活。因此您可以將他置入到現有的任何系統中。

沒有單點:Gearman不僅可以幫助擴展系統,同樣可以避免系統的失敗。

 

Beanstalkd:

Beanstalkd是一個高性能、分佈式、輕量級的內存隊列系統。

 

基本概念:

job: 需要異步處理的任務,是Beanstalkd中的基本單元,需要放在一個tube中。

tube: 任務隊列,用來存儲統一類型的job,是producer和consumer操作的對象。
producer: job的生產者,通過put命令來將一個job放到一個tube中。
consumer: job的消費者,通過reserve|release|bury|delete命令來獲取job或改變job的狀態。

 

圖3、Beanstalkd中任務的生命週期

 

同Memcached的設計類似,Beanstalkd的協議設計比較簡單明瞭,當一個任務被添加進Beanstalkd的隊列裏時,它的生命週期如圖3所示。可以看到job有READY,RESERVED,DELAYED,BURIED四個狀態。當一個producer直接put一個job之後,該job便進入了READY狀態,等待consumer來處理。如果選擇延遲put,job就先到DELAYED狀態,等待指定時間後才遷移到READY狀態。當consumer獲取到該job後,該job的狀態就從READY遷移RESERVED,這樣其他的consumer就不能再操作該job;當consumer完成該job後,可以選擇delete,release或者bury操作;delete之後,job從系統消亡,之後不能再獲取;release操作可以重新把該job狀態遷移回READY(也可以延遲該狀態遷移操作),使其他的consumer可以繼續獲取和執行該job; 

Beanstalkd中有一到多個tube。每個tube都有一個ready隊列和一個delay隊列組成。一個job的生命週期只會存在於一個tube中。consumer要從某個tube獲取job,可以向其發送watch命令;如果consumer想忽略某些tube,則可以像其發送ignore命令。consumer感興趣的tube集合稱之爲wath list。顯然,一個consumer獲取的job肯定是來自它的watch list當中。

當一個consumer沒有指定tube名稱時,它有一個默認的watch list稱之爲default。同理,如果producer提交job時沒有指定tube名稱,則默認添加到default當中。 

當tube被引用時,它們會根據需要自動創建。如果一個tube中是空的(即它不包含REDY,DELAYED,BURIED jobs),並且沒有consumer連接到它,它就會被刪除。 

 

特性:

優先級:支持0到2**32的優先級,值越小,優先級越高,默認優先級爲1024。

持久化:可以通過binlog將job及其狀態記錄到文件裏面,在Beanstalkd下次啓動時可以通過讀取binlog來恢復之前的job及狀態。

分佈式容錯:分佈式設計和Memcached類似,beanstalkd各個server之間並不知道彼此的存在,都是通過client來實現分佈式以及根據tube名稱去特定server獲取job。

任務休眠:當一個job發生錯誤,你可以將其bury(休眠)。這個特性方便了以後的調試和排查工作(甚至重新運行),同事將該job與其它活動的job分開。

超時控制:爲了防止某個consumer長時間佔用任務但不能處理的情況,Beanstalkd爲reserve操作設置了timeout時間,如果該consumer不能在指定時間內完成job,job將被遷移回READY狀態,供其他consumer執行。

 

總結

表1、Gearman和Beanstalkd總結

Gearman

Beanstalkd

Language

C

C

Ubuntu Package

gearman-job-server

beanstalkd

Python lib

gearman

beanstalkc

Memory

1.4Mb

0.7Mb

License

BSD

GPL

Beanstalk速度非常快,協議簡單,佔用內存空間少(這點從表1中可以看出),而且支持持久化。唯一的不足是掛了之後恢復慢,3G日誌數據恢復了十多分鐘。

Gearman支持簡單的優先級和同步與異步任務,配置一下可以實現隊列信息持久化,Gearman最大的問題是自己維護隊列卻沒有提供查看隊列的接口,哪怕是命令行接口,這導致在高速寫入後,很難判定所有的job是不是都完成了,如果配置了外部持久化存儲,這個問題也容易解決,Gearman用的人比較多,性能比較優秀。

 

參考資料:

[1] http://www.cnblogs.com/cocowool/archive/2011/08/18/2145144.html

[2] http://www.ibm.com/developerworks/cn/opensource/os-php-gearman/

[3] http://gearman.org/

[4] https://github.com/kr/beanstalkd/wiki/faq

[5] http://rdc.taobao.com/blog/cs/?p=1201

[6] http://adam.heroku.com/past/2010/4/24/beanstalk_a_simple_and_fast_queueing_backend/

[7] http://www.darkcoding.net/software/choosing-a-message-queue-for-python-on-ubuntu-on-a-vps/

 

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