Beanstalkd 是一款高效能、輕量級的分散式記憶體訊息佇列。 輕量是通過對比而來,相比RabbitMQ和Kafka,Beanstalkd顯得更加簡單易用,同時可以滿足小系統的應用,可以實現生產者和消費者分離模式。
一、概念
- **job:**一個需要非同步處理的任務,是 Beanstalkd 中的基本單元,需要放在一個 tube 中
- **tube:**一個有名的任務佇列,用來儲存統一型別的 job,是 producer 和 consumer 操作的物件
- **producer:**Job 的生產者,通過 put 命令來將一個 job 放到一個 tube 中
- **consumer:**Job的消費者,通過 reserve/release/bury/delete 命令來獲取 job 或改變 job 的狀態
二、生命週期
producer(生產者)put一個新的job到tube時,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。
- READY - 需要立即處理的任務,當延時 (DELAYED) 任務到期後會自動成為當前任務
- DELAYED - 延遲執行的任務, 當消費者處理任務後, 可以用將訊息再次放回 DELAYED 佇列延遲執行
- RESERVED - 已經被消費者獲取, 正在執行的任務。Beanstalkd 負責檢查任務是否在 TTR(time-to-run) 內完成
- BURIED - 保留的任務: 任務不會被執行,也不會消失,除非有人把它 "踢" 回佇列
- DELETED - 訊息被徹底刪除。Beanstalkd 不再維持這些訊息
三、特性
1. 優先順序(priority)
對於很緊急的消費者可以讓他在佇列中提前,實現插隊行為
2. 延遲(delay)
設定的任務在多少秒後才能被消費者讀取,可以實現定時任務,如定時點贊等
3. 持久化(persistent data)
出現伺服器當機等情況,資料依然存在
4. 預留(buried)
消費者將無法取出任務,在其他合適的時機在拿出消費
**5. 任務超時重發(time-to-run) **
消費者必須在指定的時間內處理完任務,否則這個任務將重新被放入佇列
四、安裝
#下載軟體-編譯安裝
git clone git://github.com/kr/beanstalkd.git
cd beanstalkd
#編譯
make
#安裝完成-預設安裝在/usr/local/bin/
#yum安裝
yum -y install beanstalkd --enablerepo=epel
#配置檔案
/etc/sysconfig/beanstalkd
#啟動並繫結埠
beanstalkd -l 127.0.0.1 -p 11300 -b /home/software/binstalkd/binlogs
#-b開啟日誌備份,重啟恢復資料
#安裝php操作類
composer require pda/pheanstalk
複製程式碼
建立demo.php檔案
<?php
require './vendor/autoload.php';
$p = new \Pheanstalk\Pheanstalk('127.0.0.1',11300);
print_r($p->stats());// 列印出佇列所有資訊
複製程式碼
佇列引數
'current-jobs-urgent' => '0', // 優先順序小於1024狀態為ready的job數量
'current-jobs-ready' => '0', // 狀態為ready的job數量
'current-jobs-reserved' => '0', // 狀態為reserved的job數量
'current-jobs-delayed' => '0', // 狀態為delayed的job數量
'current-jobs-buried' => '0', // 狀態為buried的job數量
'cmd-put' => '0', // 總共執行put指令的次數
'cmd-peek' => '0', // 總共執行peek指令的次數
'cmd-peek-ready' => '0', // 總共執行peek-ready指令的次數
'cmd-peek-delayed' => '0', // 總共執行peek-delayed指令的次數
'cmd-peek-buried' => '0', // 總共執行peek-buried指令的次數
'cmd-reserve' => '0', // 總共執行reserve指令的次數
'cmd-reserve-with-timeout' => '0',
'cmd-delete' => '0',
'cmd-release' => '0',
'cmd-use' => '0', // 總共執行use指令的次數
'cmd-watch' => '0', // 總共執行watch指令的次數
'cmd-ignore' => '0',
'cmd-bury' => '0',
'cmd-kick' => '0',
'cmd-touch' => '0',
'cmd-stats' => '2',
'cmd-stats-job' => '0',
'cmd-stats-tube' => '0',
'cmd-list-tubes' => '0',
'cmd-list-tube-used' => '0',
'cmd-list-tubes-watched' => '0',
'cmd-pause-tube' => '0',
'job-timeouts' => '0', // 所有超時的job的總共數量
'total-jobs' => '0', // 建立的所有job數量
'max-job-size' => '65535', // job的資料部分最大長度
'current-tubes' => '1', // 當前存在的tube數量
'current-connections' => '1', // 當前開啟的連線數
'current-producers' => '0', // 當前所有的開啟的連線中至少執行一次put指令的連線數量
'current-workers' => '0', // 當前所有的開啟的連線中至少執行一次reserve指令的連線數量
'current-waiting' => '0', // 當前所有的開啟的連線中執行reserve指令但是未響應的連線數量
'total-connections' => '2', // 總共處理的連線數
'pid' => '3609', // 伺服器程式的id
'version' => '1.10', // 伺服器版本號
'rusage-utime' => '0.000000', // 程式總共佔用的使用者CPU時間
'rusage-stime' => '0.001478', // 程式總共佔用的系統CPU時間
'uptime' => '12031', // 伺服器程式執行的秒數
'binlog-oldest-index' => '2', // 開始儲存jobs的binlog索引號
'binlog-current-index' => '2', // 當前儲存jobs的binlog索引號
'binlog-records-migrated' => '0',
'binlog-records-written' => '0', // 累積寫入的記錄數
'binlog-max-size' => '10485760', // binlog的最大容量
'id' => '37604ac4305d3b16', // 一個隨機字串,在beanstalkd程式啟動時產生
'hostname' => 'localhost.localdomain',
複製程式碼
更多的方法
#檢視當前存在的所有管道
$p->listTubes();
#檢視管道資訊,例如newUsers管道
$p->statusTubes('newUsers');
#指定要使用的管道資訊,新增任務
$p->useTube('newUsers')->put('test');
#監聽管道 取出任務
$job = $p->watch('newUsers')->reserve();
#檢視被取出任務的資訊
$state = $p->statsJob($job);
print_r($state);
#根據任務id獲取任務引數
$job = $p->peek(id);
$state = $p->statsJob($job);
複製程式碼
任務引數
'id' => '1', // job id
'tube' => 'test', // job 所在的管道
'state' => 'reserved', // job 當前的狀態
'pri' => '1024', // job 的優先順序
'age' => '5222', // 自 job 建立時間為止 單位:秒
'delay' => '0',
'ttr' => '60', // time to run
'time-left' => '58', // 僅在job狀態為reserved或者delayed時有意義,當job狀態為reserved時表示剩餘的超時時間
'file' => '2', // 表示包含此job的binlog序號,如果沒有開啟它將為0
'reserves' => '10', // 表示job被reserved的次數
'timeouts' => '0', // 表示job處理的超時時間
'releases' => '1', // 表示job被released的次數
'buries' => '0', // 表示job被buried的次數
'kicks' => '0', // 表示job被kiced的次數
複製程式碼