beanstalkd 訊息佇列的第一手資料

2021-09-22 08:59:46 字數 3054 閱讀 5429

beanstalk 訊息佇列 小結 

協議說明和各狀態轉換情況

基本知識點:

1. 對於beanstalk 訊息佇列中每條資料都為 job

2. beanstalk service端 ,會維護 tubes[多個管道]

3. client端可以監聽,使用多 tube

4. client端可以指定 use 管道[ client生成乙個新的job時會把此job提交到 指定管道]

5. client端可以指定 watch 管道 [ client接收處理job時會到 指定管道得到待處理的job]

官方示意圖:

put            reserve               delete

-----> [ready] ---------> [reserved] --------> *poof*

一般情況:

1. 任務提交到service端,job 管理放入記憶體空間並為其標記狀態 [ready] 

2. client通過輪訓競爭得到次狀態, job 改為  [reserved]

2.1 當在預設時間 120 秒內沒處理完 , job.stats.timeouts 就會大於 0 

同時其他 輪訓競爭client會拿到這個job【 注意了 每次timeouts時,在輪訓的客戶端就會得到次job,狀態都為 ready,timeouts>0 】

3. 隨便其中一台client處理完 job.delete   , 其他 client 中的此job 都會    *poof*  

deom - python beanstalkc 中 job.stats 參考:

使用 easy_install beanstalkc

api 參考 :

剛生成的 beanstalk

以timeout了的 beanstalk,並且在其他client輪訓到 job

當沒所有client 的 job 都到期 了 狀態

其中 client1 job.delete

client1 job.stats  *poof*

client2 job.stats  *poof*

比較全的狀態說明 - [官方文件]

官方示意圖:

先簡單說明下(完全自己理解的,歡迎拍磚。本人e人太差~看官檔費勁,諒解下):

job.stats狀態 = [ready] 待處理,  [reserved] 正處理, [delayed]延遲狀態 ,  [buried] 隱藏狀態

1. 延遲提交

py.client1.put>>> beanstalk.put('yes!', delay=10)

py.client3.reserve>>> job = beanstalk.reserve()

# 等待 10  秒

2. 管道測試

put-job到service端 可以指定 put的tube管道

如: py.client1.put>>> beanstalk.use('foo') 

py.client1.put>>> beanstalk.put('hey!')

py.client2.reserve>>> job = beanstalk.reserve()

# 一直擁塞,應為 他 watch 管道 'default'

py.client3.reserve>>> beanstalk.watch('foo')

# beanstalk.ignore('bar') 放棄監聽 bar

py.client3.reserve>>> job = beanstalk.reserve()

py.client3.reserve>>> job.body #輸出 'hey!' 

3. 隱藏狀態 現在吧 client 1/2/3 的 use watch 的管道都調回 default

py.client2.reserve>>> job = beanstalk.reserve()

py.client3.reserve>>> job = beanstalk.reserve()

py.client1.put>>> beanstalk.put('隱藏狀態!')

py.client2.reserve>>> job.bury() #2 輪訓得到 並且 修改 job 為隱藏狀態

# 120 秒後 client3 沒有輪訓得到 此job 

py.client2.reserve>>> job.stats() 

py.client2.reserve>>> beanstalk.kick( job.stats()['id'] ) #修改狀態為 reserved

# 立刻 client3 得到 job

py.client3.reserve>>> job.stats()

# 這時候 client2 / 3 同時 有 job 11 狀態 'buries': 1,'timeouts': 0,'state': 'reserved'

4. peek 窺見

可以得到 乙個 stats - read 的 job ,其他 client 可以 job = beanstalk.reserve() 

後馬上 job.stats 會變成  [reserved] 

py.client2.reserve>>> job = beanstalk.peek_ready()

取得 job 並看 本 client 能 處理能

>>> job = beanstalk.peek(3)

>>> job.body

'yes!'

>>> job.stats()['state']

'ready'

這種形式西 job 不能 bury 等修改狀態,但 可以 delete

peek 系類

peek_buried

peek_ready

beanstalkd 訊息佇列的第一手資料

beanstalkd訊息佇列

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

Beanstalkd訊息佇列介紹

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

beanstalkd 訊息佇列發郵件

放入訊息 獲取beanstalk例項 staticvar resource bool beanstalk return resource function get beanstalk libraries beanstalkd pheanstalk init.php 載入配置檔案 ci get ins...