1. 程式人生 > >初步使用小、巧、快訊息佇列元件beanstalkd

初步使用小、巧、快訊息佇列元件beanstalkd

一、簡介:

1、Beanstalkd是什麼?

Beanstalkd是一個高效能,輕量級的分散式記憶體佇列,當你用過memcache,你會有種熟悉感覺,因為它是類似 memcached 的輕量級通訊協議,具有有很高的效能

2、Beanstalkd特性
  1. 支援優先順序(支援任務插隊)
  2. 延遲(實現定時任務)
  3. 持久化(定時把記憶體中的資料刷到binlog日誌)
  4. 預留(把任務設定成預留,消費者無法取出任務,等某個合適時機再拿出來處理)
  5. 任務超時重發(消費者必須在指定時間內處理任務,如果沒有則認為任務失敗,重新進入佇列)

  6. 上面介紹那麼多個特性中,跟redis或者mysql中實現的訊息佇列的方法比較,其中最大特點就是可以實現優先順序
    ,還有定時執行

二、安裝

1、系統環境centos7
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm  #安裝額外的庫 
yum install beanstalkd --enablerepo=epel
2、啟動beanstalkd
/usr/bin/beanstalkd -l 0.0.0.0 -p 11300 -b /var/lib/beanstalkd/binlog -F
3、後臺啟動
beanstalkd -l 地址 -p 埠號 -z 最大的任務大小(byte) -c
&

三、php客戶端呼叫

1、安裝composer
> curl -sS https://getcomposer.org/installer | php
> mv composer.phar /usr/local/bin/composer
#牆內配置下源
>composer config -g repo.packagist composer https://packagist.phpcomposer.com
> composer require pda/pheanstalk
2、常用方法
2.1、維護方法
stats() 檢視狀態方法
listTubes
() 目前存在的管道 listTubesWatched() 目前監聽的管道 statsTube() 管道的狀態 useTube() 指定使用的管道 statsJob() 檢視任務的詳細資訊 peek() 通過任務ID獲取任務
2.2、生產者方法
putInTube() 往管道中寫入資料
put() 配合useTube()使用
2.3、消費者方法
watch() 監聽管道,可以同時監聽多個管道
ignore() 不監聽管道
reserve() 以阻塞方式監聽管道,獲取任務
reserveFromTube() 
release() 把任務重新放回管道
bury() 把任務預留
peekBuried() 把預留任務讀取出來
kickJob()buried狀態的任務設定成ready
kick() 批量把buried狀態的任務設定成ready
peekReady() 把準備好的任務讀取出來
peekDelayed() 把延遲的任務讀取出來
pauseTube() 給管道設定延遲
resumeTube() 取消管道延遲
touch() 讓任務重新計算ttr時間,給任務續命
3、具體簡單使用

檢視資訊,新建info.php

<?php
require './vendor/autoload.php';

use Pheanstalk\Pheanstalk;

$p = new Pheanstalk('127.0.0.1', 11300);
//檢視beanstalkd當前的狀態資訊
var_dump($p->stats());

結果:

生產者producer.php程式碼如下:

<?php
require './vendor/autoload.php';

use Pheanstalk\Pheanstalk;

//建立一個Pheanstalk物件
$p = new Pheanstalk('127.0.0.1', 11300);

$data = array(
    'id' => 1,
    'name' => 'test',
);

//向userReg管道中新增任務,返回任務ID
//put()方法有四個引數
//第一個任務的資料
//第二個任務的優先順序,值越小,越先處理
//第三個任務的延遲
//第四個任務的ttr超時時間
$id = $p->useTube('userReg')->put(json_encode($data));
//獲取任務
$job = $p->peek($id);
//檢視任務狀態
print_r($p->statsJob($job));

結果:

消費者consumer.php程式碼如下:

<?php
require './vendor/autoload.php';

use Pheanstalk\Pheanstalk;

//建立一個Pheanstalk物件
$p = new Pheanstalk('127.0.0.1', 11300);

//監聽userReg管道,忽略default管道
$job = $p->watch('userReg')->ignore('default')->reserve();

$data = json_decode($job->getData());
//列印任務中的資料
print_r($data);

//最後刪除任務,表示任務處理完成
$p->delete($job);

結果:

參考:

官網

中文文件