beanstalkd協議解讀(中文翻譯加個人理解)
最近有需求做全平臺的定時器,業務複雜,效能要求高,linux crontab的方式不適用,調研一些支援定時執行的記憶體佇列系統,其中beanstalkd較適合。先將其協議研究一遍,使用就不是問題了。
總括
beanstalkd協議基於ASCII編碼執行在tcp上。客戶端連線伺服器併發送指令和資料,然後等待響應並關閉連線。對於每個連線,伺服器按照接收命令的序列依次處理並響應。所有整型值都非負的十進位制數,除非有特別宣告。
名稱約定
所有名稱必須是ASCII碼字串,即包括:
字母(A-Z和a-z)
數字(0-9)
加號 +
斜線 /
連字元 -
分號 ;
點 .
美元符號 $
下劃線 _
括號 ()
注意:名稱不能以連字元開始,並且是以空白字元結束,每個名稱至少包含一個字元。
錯誤說明
返回的錯誤 描述
OUT_OF_MEMORY\r\n 伺服器沒有足夠的記憶體分配給特定的job,客戶端應該稍後重試
INTERNAL_ERROR\r\n 伺服器內部錯誤,該錯誤不應該發生,如果發生了,請報告:http://groups.google.com/group/beanstalk-talk.
BAD_FORMAT\r\n 格式不正確,客戶端傳送的指令格式出錯,有可能不是以\r\n結尾,或者要求整型值等等
UNKNOWN_COMMAND\r\n 未知的命令,客戶端傳送的指令伺服器不理解
job的生命週期
一個工作任務job當client使用put命令時建立。在整個生命週期中job可能有四個工作狀態:ready,reserved,delayed,buried。在put之後,一個job的典型狀態是ready,在ready佇列中,它將等待一個worker取出此job並設定為其為reserved狀態。worker佔有此job並執行,當job執行完畢,worker可以傳送一個delete指令刪除此job。
狀態碼 描述
ready 等待被取出並處理
reserved 如果job被worker取出,將被此worker預訂,worker將執行此job
delayed 等待特定時間之後,狀態再遷移為ready狀態
buried 等待喚醒,通常在job處理失敗時
job典型的生命週期
put reserve delete ---------> [READY] ----------------> [RESERVED] ------------> *poof*
job可能的狀態遷移
Tubes
有名的任務佇列,一個伺服器有一個或者我個tubes,用來儲存統一型別的job。每個tube由一個就緒佇列與延遲佇列組成。每個job所有的狀態遷移在一個tube中完成。consumers消費者可以監控感興趣的tube,通過傳送watch指令。consumers消費者可以取消監控tube,通過傳送ignore命令。通過watch list命令返回所有監控的tubes,當客戶端預訂一個job,此job可能來自任何一個它監控的tube。
當一個客戶端連線上伺服器時,客戶端監控的tube預設為defaut,如果客戶端提交job時,沒有使用use命令,那麼這些job就存於名為default的tube中。
tube按需求建立,無論他們在地方被引用到。如果一個tube變為空(即no ready jobs,no delayed jobs,no buried jobs)和沒有任何客戶端引用,它將會被自動刪除。
指令說明(Commands)
生產者指令說明(Producer Commands)
put
說明
插入一個job到佇列
格式
put
\r\n
\r\n
pri 整型值,為優先順序,可以為0-2^32,值越小優先順序越高,預設為1024。
delay 整型值,延遲ready的秒數,在這段時間job為delayed狀態。
ttr 整型值,允許worker執行的最大秒數,如果worker在這段時間不能delete,release,bury job,那麼job超時,伺服器將release此job,此job的狀態遷移為ready。最小為1秒,如果客戶端指定為0將會被重置為1。
bytes 整型值,job body的長度,不包含\r\n,這個值必須小於max-job-size,預設為2^16。
data job body
響應
INSERTED \r\n 表示插入job成功,id為新job的任務標識,整型值
BURIED \r\n 如伺服器為了增加佇列的優先順序而,記憶體不足時返回,id為新job的任務標識,整型值
EXPECTED_CRLF\r\n job body必須以\r\n結尾
JOB_TOO_BIG\r\n job body的長度超過max-job-size
DRAINING\r\n 表示伺服器資源耗盡,表示伺服器已經進入了“drain mode”,伺服器再也不能接受連線,客戶端應該使用另一個伺服器或者斷開稍後重試
use
說明
producer生產者使用,隨後使用put命令,將job放置於對應的tube
格式
use \r\n
tube tube的名稱,最大為200位元組,不存在時將自動建立
響應
USING \r\n tube為正在使用的tube名稱
消費者指令說明(Worker Commands)
reserve
說明
取出(預訂)job,待處理。它將返回一個新預訂的job,如果沒有job,beanstalkd將直到有job時才傳送響應。一旦job狀態遷移為reserved,取出job的client被限制在指定的時間(如果設定了ttr)完成,否則超時,job狀態重灌遷移為ready。
格式
reserve\r\n
可選的一個相似的命令
reserve-with-timeout \r\n 設定取job的超時時間,timeout設定為0時,伺服器立即響應或者TIMED_OUT,積極的設定超時,將會限制客戶端阻塞在取job的請求的時間。
響應
DEADLINE_SOON\r\n During the TTR of a reserved job, the last second is kept by the server as a safety margin, during which the client will not be made to wait for another job. If the client issues a reserve command during the safety margin, or if the safety margin arrives while the client is waiting on a reserve command.
TIMED_OUT\r\n 超時
RESERVED
\r\n
\r\n
成功取出job,id為job id,整型值,job body的長度,不包含\r\n,data為job body
delete
說明
從佇列中刪除一個job
格式
delete \r\n
id為job id
響應
DELETED\r\n 刪除成功
NOT_FOUND\r\n job不存在時,或者job的狀態不為ready和buried(這種情況是在job執行超時之前,client傳送了delete指令)
release
說明
release指令將一個reserved的job放回ready queue。它通常在job執行失敗時使用。
格式
release \r\n
id 為job id,pri為job的優先順序,delay為延遲ready的秒數
響應
RELEASED\r\n 表明成功
BURIED\r\n 如伺服器為了增加佇列的優先順序而,記憶體不足時返回
NOT_FOUND\r\n 如果job不存在或者client沒有預訂此job
bury
說明
將一個job的狀態遷移為buried,通過kick命令喚醒
格式
bury \r\n
id為job id,pri為優先順序
響應
BURIED\r\n 表明成功
NOT_FOUND\r\n 如果job不存在或者client沒有預訂此job
touch
說明
允許worker請求更多的時間執行job,這個很有用當job需要很長的時間來執行,worker可用週期的告訴伺服器它仍然在執行job(可以被DEADLINE_SOON觸發)
格式
touch \r\n
id為job id
響應
TOUCHED\r\n 表明成功 NOT_FOUND\r\n 如果job不存在或者client沒有預訂此job
watch
說明
新增監控的tube到watch list列表,reserve指令將會從監控的tube列表獲取job,對於每個連線,監控的列表預設為default
格式
watch \r\n
tube 為監控的tube名稱,名稱最大為200位元組,如果tube不存在會自動建立
響應
WATCHING \r\n 表明成功
count 整型值,已監控的tube數量
ignore
說明
從已監控的watch list列表中移出特定的tube
格式
ignore \r\n
tube 為移出的tube名稱,名稱最多為200位元組,如果tube不存在會自動建立
響應
WATCHING \r\n 表明成功
count 整型值,已監控的tube數量
NOT_IGNORED\r\n 如果client企圖忽略其僅有的tube時的響應
其他指令說明(Other Command)
peek
說明
讓client在系統中檢查job,有四種形式的命令,其中第一種形式的指令是針對當前使用的tube
格式
peek \r\n 返回id對應的job
peek-ready\r\n 返回下一個ready job
peek-delayed\r\n 返回下一個延遲剩餘時間最短的job
peek-buried\r\n 返回下一個在buried列表中的job
響應
NOT_FOUND\r\n 如果job不存在,或者沒有對應狀態的job
FOUND \r\n \r\n
id 為對應的job id
bytes job body的位元組數
data 為job body
kick
說明
此指令應用在當前使用的tube中,它將job的狀態遷移為ready或者delayed
格式
kick \r\n
bound 整型值,喚醒的job上限
響應
KICKED \r\n
count 為真實喚醒的job數量
kick-job
說明
kick指令的一個變體,可以使單個job被喚醒,使一個狀態為buried或者delayed的job遷移為ready,所有的狀態遷移都在相同的tube中完成
格式
kick-job \r\n
id 為job id
響應
NOT_FOUND\r\n 如果job不存在,或者job是不可喚醒的狀態
KICKED\r\n 表明成功
stats-job
說明
統計job的相關資訊
格式
stats-job \r\n
id 為job id
響應
NOT_FOUND\r\n 如果job不存在
OK \r\n \r\n
bytes 為接下來的data區塊的長度
data 為YAML file的統計資訊
其中YAML file包括的key有:
id 表示job id
tube 表示tube的名稱
state 表示job的當前狀態
pri 表示job的優先順序
age 表示job建立的時間單位秒
time-left 表示job的狀態遷移為ready的時間,僅在job狀態為reserved或者delayed時有意義,當job狀態為reserved時表示剩餘的超時時間。
file 表示包含此job的binlog序號,如果沒有開啟它將為0
reserves 表示job被reserved的次數
timeouts 表示job處理的超時時間
releases 表示job被released的次數
buries 表示job被buried的次數
kicks 表示job被kiced的次數
stats-tube
說明
統計tube的相關資訊
格式
stats-tube \r\n
tube 為對應的tube的名稱,最多為200位元組
響應
NOT_FOUND\r\n 如果tube不存在
OK \r\n \r\n
bytes 為接下來的data區塊的長度
data 為YAML file的統計資訊
其中YAML file包括的key有:
name 表示tube的名稱
current-jobs-urgent 此tube中優先順序小於1024狀態為ready的job數量
current-jobs-ready 此tube中狀態為ready的job數量
current-jobs-reserved 此tube中狀態為reserved的job數量
current-jobs-delayed 此tube中狀態為delayed的job數量
current-jobs-bureid 此tube中狀態為buried的job數量
total-jobs 此tube中建立的所有job數量
current-using 使用此tube開啟的連線數
current-wating 使用此tube開啟連線並且等待響應的連線數
current-watching 開啟的連線監控此tube的數量
pause 此tube暫停的秒數
cmd-delete 此tube中總共執行的delete指令的次數
cmd-pause-tube 此tube中總共執行pause-tube指令的次數
pause-time-left 此tube暫停剩餘的秒數
stats
說明
返回整個訊息佇列系統的整體資訊
格式
stats\r\n
響應
OK \r\n \r\n
bytes 為接下來的data區塊的長度
data 為YAML file的統計資訊
其中YAML file包括的key有(所有的資訊都累積的,自從beanstalkd程序啟動以來,這些資訊不儲存在binlog中):
current-jobs-urgent 優先順序小於1024狀態為ready的job數量
current-jobs-ready 狀態為ready的job數量
current-jobs-reserved 狀態為reserved的job數量
current-jobs-delayed 狀態為delayed的job數量
current-jobs-bureid 狀態為buried的job數量
相關推薦
beanstalkd協議解讀(中文翻譯加個人理解)
最近有需求做全平臺的定時器,業務複雜,效能要求高,linux crontab的方式不適用,調研一些支援定時執行的記憶體佇列系統,其中beanstalkd較適合。先將其協議研究一遍,使用就不是問題了。 總括 beanstalkd協議基於ASCII編碼執行在tcp上。客戶
sql資料庫連線:使用者‘sa’登入失敗問題破解(百度加個人總結)
程式設計環境:Microsoft Visual C# 2005 資料庫:sql server2005 目的:使用GridView控制元件繫結資料 頁面載入時間Page_Load中編寫程式碼如下: string sqlCon = "Data Source=(l
html5學習筆記(一)(摘抄講義加部分理解)
視訊地址:http://study.163.com/course/courseMain.htm?courseId=1003005 講義地址:https://wizardforcel.gitbooks.io/liyanhui-tutorials/content/2.html
RTMP協議v1.0(中文翻譯)
摘要 此備忘錄描述了 Adobe公司的實時訊息傳輸協議(RTMP),此協議從屬於應用層,被設計用來在適合的傳輸協議(如TCP)上覆用和打包多媒體傳輸流(如音訊、視訊和互動內容)。 目錄 1.簡介 1.1.術語 2.貢獻者 3.定義 4.位元組序,對齊,和時間格式 5.RTMP塊流 5
vue-cli簡介(中文翻譯)
註冊 custom 默認 ebp 不能 元數據 sim tar template vue-cli是一個簡單的vuejs腳手架命令行工具。 安裝 準備:Node.js(>=4.x,推薦6.x版本),npm版本3以上和Git。 $npm install -g vue-c
BCI Competition 2008 - Graz data set B(中文翻譯)
R. Leeb 1 , C. Brunner 1 , G. R. M uller-Putz 1 , A.Schlogl 2 , and G.Pfurtscheller 1
Emacs 快速指南(中文翻譯)
Emacs 快速指南 目錄 1. 小結(SUMMARY)
ASoC 概述(中文翻譯) / ASoC Overview
本文為 ASoC 框架的概述性文件,翻譯自 Linux 核心原始碼文件中的 Documentation/sound/alsa/soc/overview.txt,遵循 GPL 協議。 文中如有翻譯不當的地方,請不吝指正。 【譯文正文】 ASoC層 ====
Java font.properties 配置檔案(中文/翻譯中。。。)
The Java 2 platform defines five logical font names that every implementation must support: Serif, SansSerif, Monospaced, Dialog, and Dial
部分opencv中的GPU加速函式(中文翻譯)
由於專案需要,翻譯了一部分可以用於我現在專案的opencv函式,記錄於此,原始英文文件來自於http://blog.csdn.net/mtt_sky/article/details/42607839。 getCudaEnableDeviceCount:返回已安裝CUDA裝置的數量;
DAPM 概述(中文翻譯)/ dapm.txt
本文為 DAPM (Dynamic Audio Power Management,動態音訊電源管理)的概述性文件,翻譯自 Linux 核心原始碼文件中的 Documentation/sound/alsa/soc/dapm.txt,遵循 GPL 協議。
如何利用arcgis製作好看的地形圖(轉載加個人註解)
如何製作好看的地形圖? 現在有一個方法讓地形圖看起來比較好,那就是3D地圖—立體地形圖 如何進行製作呢? 網上有不少相關方法,如果有一定基礎,肯定一看就懂,但是像我這樣的小白使用者,卻不一定能懂,因此,把自己在操作過程中遇到的一些問題,以及如何進行解決
框架註解(轉載加個人補充)
註解的好處:1.能夠讀懂別人寫的程式碼,特別是框架相關的程式碼。2.本來可能需要很多配置檔案,需要很多邏輯才能實現的內容,就可以使用一個或者多個註解來替代,這樣就使得程式設計更加簡潔,程式碼更加清晰。3.(重點)刮目相看。(但是怎麼樣才能讓別人刮目相看呢?會用註解不是目的,最重要的是要使用自定義註解來解決問題
HDU 1041 Computer Transformation(找規律加大數乘)
esp ios ctype nsf printf stream ont tac tran 主要還是找規律,然後大數相乘 #include<stdio.h> #include<string.h> #include<math.h> #inc
fiddler 的AutoRespoder的使用(手動添加測試樁)
提醒 https 百度 其他 添加數據 tor 技術 手動 信息 ---恢復內容開始--- 1、首先我們抓取一個百度的請求,由於百度請求是https協議,需要手動添加證書(這個不寫了,大佬們自己手動找下資料) 2、fiddler抓取的百度請求,其他的無關信息刪除,便於查看
hdu 6315 Naive Operations(線段樹 加ok標記)
題目連結 看大佬部落格:https://www.cnblogs.com/chenquanwei/p/9374234.html 題意:有兩個操作: 1:a陣列l到r的區間都加1; 2:計算l到r內a[i]/b[i]的值的和; 可以只用一個b陣列,每次進行1操作的時候就給相應位置減一
flutter/dart 程式碼 規範 翻譯 加自我理解
前言 最近看qq群裡發的很多程式碼截圖,感覺命名規則/檔案命名都不符合規範 很多朋友都是從其他語言轉向dart/flutter的,深感語言環境還需要大家共同去維護,建議還是規範化程式碼,這樣所有人看著都會舒服 恰好dart語言官方有自己的程式碼規範和相關的說明,在dartlang官網
1 金額轉化(中文大寫轉化為數字)(郭勇延)
1 金額轉化(中文大寫轉化為數字)(郭勇延) CN_NUM = { '〇
SpringMVC專題——SpringMVC的流程(個人理解)
SpringMVC處理請求: ——》訪問URL首先被DispatcherServlet截獲 ——》DispatcherServlet通過handlerMapping【定位controller,本質map<url,controlle
cocos中的觀察者模式 以及"點選事件"的註冊和分發(個人理解)
一、控制元件的點選事件註冊與完成 在學習cocos引擎時,感覺觸控事件用的比較頻繁。 於是對各種觸控事件做一些小小的總結: cocos中的控制元件(按鈕,精靈,各種容器等)。在實際開發中發現他們都是可以新增點選事件的,可以通過設定setTouchEnabled()來開啟點