PHP操作Beanstalkd佇列(1)安裝與基礎

海島發表於2018-05-19

官網 kr.github.io/beanstalkd/

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的次數
複製程式碼

相關文章