Beanstalkd: 簡單快速的Job Queue

將Web app中太耗時的部份抽出來,以非同步(asynchronous)的方式執行已經是相當常見的手法。要完成這樣的手法,你勢必需要一個Job Queue來作為背景工作的管理中心。你可以用較為完整但複雜的AMPQ,XMPP等來處理,也可以自己用資料庫的方式解決。這邊要介紹的是Beanstalkd,輕巧快速的Job Queue。

Beanstalkd

Beanstalkd的自我介紹是這樣的:

Beanstalk is a simple, fast work queue.

Its interface is generic, but was originally designed for reducing the latency of page views in high-volume web applications by running time-consuming tasks asynchronously.

Beanstalkd本身受到Memcached的影響,Protocol的設計相當簡單明瞭。當你把一個任務丟進Beanstalkd queue的時候,他的生命週期會是這樣:

你可以將一個工作放進(put)queue中,也可以指定要延後多久才開始執行(put with delay),一個工作被處理(Reserver)之後,也可以加上延後時間再放回queue裡,暫時不想執行的話,也可以把它埋起來(bury)等以後再執行。

由上圖可以看到,Beanstalkd其實支援了大多數可能會遇到的情況,Beanstalkd本身的安裝也相當簡單,參考官網上的說明即可。

Client Libraries

Beanstalkd的client library支援相當多的語言。從C/C++, Java到Perl, Ruby, Python全部都有。因為Beanstalkd的protocol相當單純,不管是將工作放進queue中,或是取出工作都相當的簡單。以下是用Ruby寫的範例:

#將工作放進queue中
beanstalk = Beanstalk::Pool.new(['localhost:11300'])
beanstalk.put('hello')
#取出工作
beanstalk = Beanstalk::Pool.new(['localhost:11300'])
loop do
  job = beanstalk.reserve
  puts job.body # prints "hello"
  job.delete
end
Tube

Tube其實就是Beanstalkd的work queue, 一個執行中的beanstalkd可以有許多不同名稱的Tube,以便工作的分類。也可以讓worker只接收到他要處理的那一類工作。

效能

至於效能呢?有人做了一個簡單的測試。

Enqueue Work
delayed job 200 jobs/seconds 120 jobs/seconds
resque 3800 jobs/seconds 300 jobs/seconds
rabbitMQ 2500 jobs/seconds 1300 jobs/seconds
beanstalkd 9000 jobs/seconds 5200 jobs/seconds

雖然不一定嚴謹,但是起碼可以看到Beanstalkd的效能是超過其他常見的解決方案的。加上Beanstalkd本身是參考Memcached的架構設計,在處理Scalabilty的問題上也是相當簡單。

結語

作為一個job queue的solution而言,Beanstalkd可以應付大多數的狀況,效能也相當有競爭力。加上容易設定(根本沒有設定檔)之類的優點,我想絕對可以作為遇到類似問題的時候的一種選擇。

當然,Beanstalkd還有其他相當好用的功能,像是Priority,Persistence,TTR等等,就直接參考他本身的文件吧。

Advertisements

Beanstalkd: 簡單快速的Job Queue” 有 1 則迴響

迴響已被關閉。