Beanstalkd簡介(job生命週期)

2021-06-02 16:08:54 字數 2155 閱讀 2718

之前在微博上調查過大家正在使用的分布式記憶體佇列系統,反饋有memcacheq,fqueue, rabbitmq, beanstalkd以及linkedin的kafka。rabbitmq使用比較廣泛,beanstalkd是後起之秀。beanstalkd之於rabbitmq,就好比nginx之於apache,varnish之於squid。後面在專案中使用beanstalkd的過程中,更發現其簡單、輕量級、高效能、易使用等特點,以及優先順序、多佇列、持久化、分布式容錯、超時控制等特性。下面就簡單介紹一下beanstalkd,不足之處請大家指正。

———————————————–正文分割線————————————————-

設計思想高效能離不開非同步,非同步離不開佇列,而其內部都是producer-consumer模式的原理。

圖1 producer-consumer模式

應用beanstalkd,乙個高效能、輕量級的分布式記憶體佇列系統,最初設計的目的是想通過後台非同步執行耗時的任務來降低高容量web應用系統的頁面訪問延遲,支援過有9.5 million使用者的facebook causes應用。後來開源,現在有postrank大規模部署和使用,每天處理百萬級任務。beanstalkd是典型的類memcached設計,協議和使用方式都是同樣的風格,所以使用過memcached的使用者會覺得beanstalkd似曾相識。

核心概念beanstalkd設計裡面的核心概念:

乙個需要非同步處理的任務,是beanstalkd中的基本單元,需要放在乙個tube中。

乙個有名的任務佇列,用來儲存統一型別的job,是producer和consumer操作的物件。

job的生產者,通過put命令來將乙個job放到乙個tube中。

job的消費者,通過reserve/release/bury/delete命令來獲取job或改變job的狀態。

beanstalkd中乙個job的生命週期如圖2所示。乙個job有ready, reserved, delayed, buried四種狀態。當producer直接put乙個job時,job就處於ready狀態,等待consumer來處理,如果選擇延遲put,job就先到delayed狀態,等待時間過後才遷移到ready狀態。consumer獲取了當前ready的job後,該job的狀態就遷移到reserved,這樣其他的consumer就不能再操作該job。當consumer完成該job後,可以選擇delete, release或者bury操作;delete之後,job從系統消亡,之後不能再獲取;release操作可以重新把該job狀態遷移回ready(也可以延遲該狀態遷移操作),使其他的consumer可以繼續獲取和執行該job;有意思的是bury操作,可以把該job休眠,等到需要的時候,再將休眠的job kick回ready狀態,也可以delete buried狀態的job。正是有這些有趣的操作和狀態,才可以基於此做出很多意思的應用,比如要實現乙個迴圈佇列,就可以將reserved狀態的job休眠掉,等沒有ready狀態的job時再將buried狀態的job一次性kick回ready狀態。

圖2 beanstalkd中job的生命週期

特性beanstalkd基於的原始碼安裝和使用很簡單,在此略過。這裡重點介紹一下其幾個很nice的特性。

支援0到2**32的優先順序,值越小,優先順序越高,預設優先順序為1024。

可以通過binlog將job及其狀態記錄到檔案裡面,在beanstalkd下次啟動時可以通過讀取binlog來恢復之前的job及狀態。

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

為了防止某個consumer長時間占用任務但不能處理的情況,beanstalkd為reserve操作設定了timeout時間,如果該consumer不能在指定時間內完成job,job將被遷移回ready狀態,供其他consumer執行。

不足在使用中發現乙個beanstalkd尚無提供刪除乙個tube的操作,只能將tube的job依次刪除,並讓beanstalkd來自動刪除空tube。還有就是beanstalkd不支援客戶端認證機制(開發者將應用場景定位在區域網)。

後續工作

參考文獻

原文:

beanstalkd訊息佇列

簡介 beanstalkd,乙個高效能 輕量級的分布式記憶體佇列系統,最初設計的目的是想通過後台非同步執行耗時的任務來降低高容量web應用系統的頁面訪問延遲,支援過有9.5 million使用者的facebook causes應用。後來開源,現在有postrank大規模部署和使用,每天處理百萬級任務...

Beanstalkd訊息佇列介紹

beanstalkd是乙個高效能,輕量級的分布式記憶體佇列 1 支援優先順序 支援任務插隊 2 延遲 實現定時任務 3 持久化 定時把記憶體中的資料刷到binlog日誌 4 預留 把任務設定成預留,消費者無法取出任務,等某個合適時機再拿出來處理 5 任務超時重發 消費者必須在指定時間內處理任務,如果...

beanstalkd 安裝 入門

beanstalkd,乙個高效能 輕量級的分布式記憶體佇列系統,最初設計的目的是想通過後台非同步執行耗時的任務來降低高容量web應用系統的頁面訪問延遲,支援過有9.5 million使用者的facebook causes應用。後來開源,現在有postrank大規模部署和使用,每天處理百萬級任務。be...