一個延時隊列服務Beanstalkd

安裝和啓動:
yum -y install beanstalkd

配置文件默認在 /etc/sysconfig/beanstalkd

nohup /usr/local/bin/beanstalkd -l 0.0.0.0 -b /mnt/beanstalkd &


特點:
拉模式:消費者需要主動從服務器拉取消息數據;
tube:類似於消息主題topic,一個beanstalkd中可以支持多個tube,每個tube都有自己的producer和consumer;多個生產者可以往同一個tube生產job,多個消費者也能監聽同一個tube獲取job;
job:代替了傳統的message,與消息最大的區別是,job有多種狀態;
conn:代表一個客戶端鏈接;
優先級:job可以有0~2^32個優先級,0代表最高優先級,beanstalkd使用堆處理job的優先級排序,因此reserve命令的時間複雜度是O(logN);
延時:生產者發佈任務時可以指定延時,到達延遲時間後,job才能被消費者消費;
超時機制:消費者從beanstalkd獲取一個job後,必須在預設的 TTR (time-to-run) 時間內處理完任務,併發送 delete / release/ bury 命令改變任務狀態;否則 Beanstalkd 會認爲消息消費失敗,重置job狀態,使其可以被其他消費者消費。如果消費者預計在 TTR (time-to-run) 時間內無法完成任務, 也可以發送 touch 命令, 它的作用是讓 Beanstalkd 從重新計時TTR;
暫停:pause命令可以暫停當前tube,暫停時期內所有job都不能夠被消費者消費;
狀態:
READY:需要立即處理的任務,當延時 (DELAYED) 任務到期後會自動成爲當前任務;
DELAYED:延遲執行的任務,;
RESERVED:已經被消費者獲取, 正在執行的任務,Beanstalkd 負責檢查任務是否在 TTR(time-to-run) 內完成;
BURIED:保留的任務: 任務不會被執行,也不會消失,除非有人將他修改爲其他狀態;
DELETED:消息被徹底刪除。Beanstalkd 不再維持這些消息;
狀態轉移圖:


細節:
beanstalkd如何維護job的狀態:tube有3個集合delay、ready和 buried分別存放對應狀態的job,conn的reserved_jobs集合存儲狀態爲reserved的job(消費者獲取一個job後,job的狀態纔會改變爲reserved,因此這個集合由conn維護)
delay狀態的job怎麼修改爲ready:delay集合是一個按照時間排序的最小堆,beanstalkd不定時循環從堆根節點獲取job,校驗是否需要改變其狀態未ready
如何實現優先級:只有ready狀態的job才能被消費者獲取消費,ready集合是一個按照優先級排序的最小堆,根節點始終是優先級最高得job
消費者持續拉模式實現:消費者使用reserve命令獲取job,beanstalkd檢查消費者監聽的所有tube,查找到ready的job即返回,否則阻塞消費者知道有ready狀態的job產生爲止
telnet 127.0.0.1 11300
命令:
use <tube>:使用指定tube
watch <tube>:監聽指定tube
ignore <tube>:取消監聽指定tube
list-tubes:列出所有的tube
list-tube-used:列出當前客戶端使用的tube
list-tubes-watched:列出當前客戶端監聽的所有tube
pause-tube <tube>:暫停指定tube,暫停期間所有job都不能再被消費者消費
put <pri><delay><ttr><data-size><data>:生產者發佈job
reserve <id> <data-size><data>:獲得堆頂的job,如果客戶端監視的所有tube都沒有ready狀態的tube,阻塞客戶端;否則返回job
reserve-with-timeout <timeout>:同reserve,只是設置最大阻塞時間
peek <id>:返回id對應的job
peek-ready:返回下一個ready的job
peek-delay:返回剩餘時間最短的delay狀態的job
peek-buried:返回下一個buried列表中的job
release <id> <pri> <delay>:將一個reserved狀態的job重置爲ready狀態
bury <id> <pri>:將job的狀態設置爲buried
kick:將buried狀態的job遷移爲ready,或將delay狀態的job遷移爲ready
kick-job <id>:將一個job的狀態遷移爲ready
delete <id>:刪除一個job
touch <id>:客戶端reserve獲取job後,發現沒有足夠時間處理此job,發送touch命令,放服務器重新開始計時TTR
stats-job <id>:查詢job狀態
stats-tube <tube>:查詢tube狀態
stats:查詢服務器統計信息
quit:退出

官方文檔:https://raw.githubusercontent.com/beanstalkd/beanstalkd/master/doc/protocol.txt

composer擴展:https://packagist.org/packages/pda/pheanstalk

大佬寫的擴展應用例子:https://www.jianshu.com/p/82c4c6fee450
————————————————
版權聲明:本文爲CSDN博主「AbleYu」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/why444216978/article/details/102152043

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