「out_of_memoryrn」 表示服務端不能為 job 分配足夠的記憶體。客戶 端應該稍後重試。 「internal_errorrn」 表示服務端的 bug。這種情況不應該發生。如果 發生了,可以報給 "bad_formatrn" 表示客戶端傳送了乙個錯誤格式的命令列。可能呢 導致這種錯誤發生的情況有:行沒有以rn 結尾、在需要整數的地方出 現了非數字字元、引數的數目錯誤、或者其他格式的命令列錯誤。 "unknown_commandrn" 表示客戶端傳送了乙個服務端不認識的 命令。 這些錯誤響應不會在本文以下各節的命令列出,但都隱含在所有命令的說明裡。客戶端在傳送命令之後都要準備好接收錯誤響應。 最後,如果服務端發生了嚴重的錯誤不能繼續服務,服務端將會主動關閉連線。job 生命週期 beanstalk 中的 job 由客戶端傳送的 」put」 命令建立。在整個的生命週期中,乙個 job 可以經歷 「ready」, 「reserved」, 「delayed」 和 」buried」 四種狀態。」put」命令之後,乙個 job 通常處於 「ready」 狀態。它將在 ready 佇列等待 worker 執行「reserve」 命令。如果這個 job 是 ready 佇列的下乙個,它將由 worker 來處理。這個 worker 將執行這個 job,當 worker 完成了該 job,可以傳送 「delete」 命令來刪除 job。 下圖是乙個簡單的 job 生命週期: 下面的說明了更複雜的情況:
系統可以有乙個或多個 tube。每個 tube 包含乙個 ready 佇列和乙個 delay 佇列。乙個 job 的生命週期只能在乙個 tube 中。consumer 可以傳送 「watch」 命令來關注乙個 tube,也可以傳送 「ignore」命令來忽略乙個 tube。被關注的 tube 將會出現在 consumer 的 「watch list」裡面。 客戶端獲取的 job 可能來自其 「watch list」中任意乙個 tube。 當客戶端剛建立連線,其 「watch list」 中只有初始設定的 「default」 tube。如果客戶端提交 job 前沒有傳送 「use」命令,job 將被儲存在 「default」 tube 中。 tube 是在被引用到時按需建立的。如果乙個 tube 空了(也就是說不包含任何 ready, delayed 或者 buried job)並且沒有客戶端引用,該 tube 將被刪除。producer 命令put 「put」 命令用來向佇列中插入乙個 job,包括乙個命令列和乙個 job 體: put rn rn 「put」 命令將向客戶端現在正在使用的 tube 中插入乙個 job(」use」 命令見下文) 。 是乙個小於 2**32 的整數。 小優先順序數值的 job 將會排在大優先順序 數值的 job 前面執行。最高優先順序是 0,最低優先順序是 4,294,967,295。 是乙個整形數,表示將 job 放入 ready 佇列需要等待的秒數。 --time to run—是乙個整形數, 表示允許乙個 worker 執行該 job 的秒 數。這個時間將從乙個 worker 獲取乙個 job 開始計算。如果該 worker 沒能在秒內刪除、釋放或休眠該 job,這個 job 就會超時,服務端 會主動釋放該 job。最小 ttr 為 1。如果客戶端設定了 0,服務端會預設將 其增加到 1。 是乙個整形數,表示 job 體的大小,不包括結尾的」rn」。這個 值不能大於 max-job-size(預設值為 2**16) 。 及 job 體,是乙個長度為的字串行。 在傳送命令列和 job 體之後,客戶端等待如下的響應: "inserted rn" 表示成功。是新 job 的數字編號。 "buried rn" 表示服務端沒有足夠的記憶體將 job 新增到優先順序佇列 中。是新 job 的數字編號。 "expected_crlfrn" 表示該 job 必須以 cr-lf 對,及 」rn」 結尾。這 兩個位元組在客戶端的 put 命令中將不會被計算到 job 大小中。 "job_too_bigrn" 表示客戶端傳送乙個超過 max-job-size 位元組的 job 體。 "drainingrn" 表示服務端已進入」drain mode」, 將不會再接收新的 job。 客戶端應該超時其他的服務端或者斷開連線稍後重試。
表示訊息體,乙個長度為 的位元組序列。這是對之前 put 命令 job 體原始位元組的逐字拷貝。delete delete 命令從服務端完全刪除乙個 job。當客戶端已經成功執行完乙個 job時,該 job 一般會被使用。客戶端可以刪除乙個已經被獲取的 job,可用的 job,以及被休眠的 job。delete 命令如下: delete rn 表示要刪除的 job id。 客戶端將等待如下的響應行: "deletedrn" 表示已經成功刪除。 "not_foundrn" 表示該 job 不存在,或者該 job 沒有被客戶端獲取, 已經不在 ready 或 buried 狀態。這種情況發生這客戶端傳送 delete 命令 之前,該 job 已經超時。release release 命令將乙個已經被獲取的 job 重新放回 ready 佇列(並將 job 狀態置為 「ready」) ,讓該 job 可以被其他客戶端執行。這個命令經常在 job 因為短暫的錯誤而失敗時使用。格式如下: release rn 表示要 release 的 job id。 表示給該 job 分配的新的優先順序。 表示在該 job 被放入 ready 佇列之前需要等待的秒數。在此期間, job 的狀態將是」delayed」。 客戶端期待的響應如下: "releasedrn" 表示成功 "buriedrn" 表示服務端沒有足夠的記憶體將 job 新增到優先順序佇列中。 "not_foundrn" 表示該 job 不存在或沒有被客戶端獲取。bury bury 命令將乙個 job 的狀態置為」buried」。buried job 被放在乙個 fifo 的鍊錶中,在客戶端呼叫 kick 命令之前,這些 job 將不會被服務端處理。 bury 命令格式如下: bury rn 表示該 job 的 id 表示分配給該 job 新的優先順序 有兩種可能的響應: "buriedrn" 表示成功 "not_foundrn" 表示該 job 不存在或沒有被客戶端獲取。
touch touch 命令允許乙個 worker 請求在乙個 job 獲取更多執行的時間。這對於那些需要長時間完成的 job 是非常有用的, 但同時也可能利用 ttr 的優勢將乙個 job從乙個無法完成工作的 worker 處移走。乙個 worker 可以通過該命令來告訴服務端它還在執行該 job(比如:在收到 deadline_soon 是可以發生給命令) 。 touch 命令格式如下: touch rn 表示當前連線獲取 job 的 id 有兩種可能的響應: " touchedrn" 表示成功 "not_foundrn" 表示該 job 不存在或沒有被客戶端獲取。watch watch 命令將乙個 tube 名稱加入當前連線的 watch list。reserve 命令將從watch list 裡面的任意乙個 tube 中獲取 job。對於每個新建的連線,watch list 中只有乙個」default」 tube。 watch rn 是乙個不超過 200 位元組的名稱。 它指定將乙個 tube 加入到 watch list。如果該 tube 不存在,將會被及時建立。 響應是: watching rn 表示當前 watch list 中的 tube 數目。ignore ignore 命令是為 consumer 設計的。ignore 命令將乙個 tube 從當前連線的watch list 中移除。 ignore rn 響應如下: "watching rn" 表示成功。表示當前 watch list 中的 tube 數目。 "not_ignoredrn" 表示客戶端正在試圖 ignore watch list 中的最後一 個 tube。
其他命令peek peek 命令可以讓客戶端檢查系統中的 job。這個命令有 4 個變種。除第乙個命令之外,其他 3 個命令都只能作用在當前使用的 tube 上面。 "peek rn" 返回編號為的 job。 "peek-readyrn" 返回當前 tube 下乙個 ready 的 job。 "peek-delayedrn" 返回當前 tube 剩餘 delay 時間最短的 job。 "peek-buriedrn" 返回當前 tube buried list 中下乙個 job。 有兩種可能的響應,其中乙個是單行: "not_foundrn" 表示請求的 job 不存在,或者沒有 job 在當前請求的狀態 佇列中。 還有乙個是一行跟乙個塊資料,表示命令執行成功: found rn rn 表示 job 的 id。 表示 job 體大小的整數,不包括結尾的 」rn」。 表示訊息體,乙個長度為 的位元組序列。kick kick 命令只能針對當前正在使用的 tube 執行。 它將 buried 或者 delayed 狀態的 job 移動到 ready 佇列。命令格式如下: kick rn 表示每次 kick job 的上限,服務端將最多 kick 個 job。 響應格式如下: kicked rn 表示本次 kick 操作作用 job 的數目。list-tubes list-tubes 命令返回已經存在的所有 tube 的列表。格式如下: list-tubesrn 響應如下: ok rn rn 是的位元組大小。 是乙個長度為的位元組序列。 它是乙個包含所有 tube 名稱 的 yaml 檔案。
list-tube-used list-tube-used 命令返回客戶當前正在使用的 tube。格式如下: list-tube-usedrn 響應如下: using rn 是正在使用的 tube 名稱。list-tubes-watched list-tubes-watched 命令返回客戶端當前正在關注的 tube 名稱列表。格式如下: list-tubes-watchedrn 響應如下: ok rn rn 是的位元組大小。 是乙個長度為的位元組序列。 它是乙個包含被關注 tube 名 稱的 yaml 檔案。pause-tube pause-tube 命令用來在給定時間內暫停從 tube 獲取 job。格式如下: pause-tube rn 表示要暫停的 tube。 表示在可以從 tube 獲取 job 之前需要等待的秒數。 有兩種可能的響應: "pausedrn" 表示成功。 "not_foundrn" 表示該 tube 不存在。quit quit 命令用來關閉當前連線。格式如下: quitrn
通訊協議 UDP通訊
通訊協議 通訊協議是udp tcp通訊的基礎,沒有通訊協議的 通訊 是沒有任何意義上的,通訊協議不是底層函式或者高深的原理,而是程式設計師之間的一種文字約定。資料在網路上是以位元組的形式傳送的 底層是01碼 我們在讀取到資料之後,該以怎樣的方式對它進行解碼呢?這就是我們在通訊之前需要制定的通訊協議。...
串列埠通訊 通訊協議
我們的串列埠程式,除了通用的,進行串列埠監聽收發的簡單工具,大多都和下位機有關,這就需要關心我們的通訊協議如何快取,分析,以及通知介面。所謂通訊協議是指通訊雙方的一種約定。約定包括對資料格式 同步方式 傳送速度 傳送步驟 檢糾錯方式以及控制字元定義等問題做出統一規定,通訊雙方必須共同遵守。因此,也叫...
通訊協議 IIC通訊
iic匯流排是由資料線sda和時鐘線scl構成的序列匯流排,可傳送和接收資料。在匯流排上一般有幾個主機 也可以多個 和多個從機。從機一般不主動傳送資料,主機傳送資料,資料報中包含有從機位址,主機通過從機位址對從機進行操作。1.空閒狀態 時鐘線和資料線都為高電平 稱為釋放匯流排 時鐘線scl由主機控制...