1. 程式人生 > >beanstalkd 安裝 入門

beanstalkd 安裝 入門

beanstalkd

介紹:

Beanstalkd,一個高效能、輕量級的分散式記憶體佇列系統,最初設計的目的是想通過後臺非同步執行耗時的任務來降低高容量Web應用系統的頁面訪問延遲,支援過有9.5 million使用者的Facebook Causes應用。後來開源,現在有PostRank大規模部署和使用,每天處理百萬級任務。Beanstalkd是典型的類Memcached設計,協議和使用方式都是同樣的風格,所以使用過memcached的使用者會覺得Beanstalkd似曾相識。

安裝

官網

https://kr.github.io/beanstalkd/

安裝

centos

yum install beanstalkd --enablerepo=epel

原始碼:

tar -zxvf /usr/bin/beanstalkd/beanstalkd-1.10.tar.gz

cd beanstalkd

make install PERFIX=/usr/bin/beanstalkd

參考:http://kr.github.io/beanstalkd/download.html

啟動

/usr/bin/beanstalkd -l 0.0.0.0 -p 11300 -b /var/lib/beanstalkd/binlog -F &

beanstalkd引數:

/usr/bin/beanstalkd -h
Use: /usr/bin/beanstalkd [OPTIONS]

Options:
-b 開啟binlog,斷電後重啟會自動恢復任務。
-f MS fsync最多每MS毫秒
-F從不fsync(預設)
-l ADDR偵聽地址(預設為0.0.0.0)
-p埠偵聽埠(預設為11300)
-u USER成為使用者和組
-z BYTES設定最大作業大小(以位元組為單位)(預設值為65535)
-s BYTES設定每個wal檔案的大小(預設為10485760) (將被舍入到512位元組的倍數)
-c壓縮binlog(預設)
- n 不要壓縮binlog
-v顯示版本資訊
-V增加冗長度
-h顯示這個幫助

4、配置檔案

/etc/sysconfig/beanstalkd

概念:

核心概念

  • job:一個需要非同步處理的任務,是 Beanstalkd 中的基本單元,需要放在一個 tube 中。
  • tube:一個有名的任務佇列,用來儲存統一型別的 job,是 producer 和 consumer 操作的物件。
  • producer:Job 的生產者,通過 put 命令來將一個 job 放到一個 tube 中。
  • consumer:Job的消費者,通過 reserve/release/bury/delete 命令來獲取 job 或改變 job 的狀態。

job 的生命週期

Paste_Image.png

當producer直接put一個job時,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。正是有這些有趣的操作和狀態,才可以基於此做出很多意思的應用,比如要實現一個迴圈佇列,就可以將RESERVED狀態的job休眠掉,等沒有READY狀態的job時再將BURIED狀態的job一次性kick回READY狀態。

  • READY - 需要立即處理的任務,當延時 (DELAYED) 任務到期後會自動成為當前任務;
  • DELAYED - 延遲執行的任務, 當消費者處理任務後, 可以用將訊息再次放回 DELAYED 佇列延遲執行;
  • RESERVED - 已經被消費者獲取, 正在執行的任務。Beanstalkd 負責檢查任務是否在 TTR(time-to-run) 內完成;
  • BURIED - 保留的任務: 任務不會被執行,也不會消失,除非有人把它 "踢" 回佇列;
  • DELETED - 訊息被徹底刪除。Beanstalkd 不再維持這些訊息。

一些特性

優先順序

任務 (job) 可以有 0~2^32 個優先順序, 0 代表最高優先順序,預設優先順序為1024。

持久化

可以通過binlog將job及其狀態記錄到檔案裡面,在Beanstalkd下次啟動時可以通過讀取binlog來恢復之前的job及狀態。

分散式容錯

分散式設計和Memcached類似,beanstalkd各個server之間並不知道彼此的存在,都是通過client來實現分散式以及根據tube名稱去特定server獲取job。

超時控制

為了防止某個consumer長時間佔用任務但不能處理的情況,Beanstalkd為reserve操作設定了timeout時間,如果該consumer不能在指定時間內完成job,job將被遷移回READY狀態,供其他consumer執行。

客戶端操作

專案地址:https://github.com/pda/pheanstalk/

1、向佇列中新增job

<?php

//建立佇列訊息

require_once('./vendor/autoload.php');

use Pheanstalk\Pheanstalk;

$pheanstalk = new Pheanstalk('127.0.0.1',11300);

$tubeName='user_eamil_message_list';

$jobData=array(
    'uid' => time(),
    'email' => '[email protected]',
    'message' => 'Hello World !!',
    'dtime' => date('Y-m-d H:i:s'),
);

$pheanstalk ->useTube( $tubeName) ->put( json_encode( $jobData));

echo json_encode($jobData).PHP_EOL;
echo 'Success ~~'.PHP_EOL;

2、從佇列中取出job

<?php


//消費佇列訊息

require_once('./vendor/autoload.php');

use Pheanstalk\Pheanstalk;

$pheanstalk = new Pheanstalk('127.0.0.1',11300);

$tubeName='user_eamil_message_list';

while(true){
    //獲取佇列資訊,reserve 阻塞獲取
    $job = $pheanstalk ->watch($tubeName) ->ignore('default') ->reserve();
    $data=$job->getData();

    //執行相關邏輯程式碼
    $ret = file_put_contents('./send_mail.log',$data,FILE_APPEND | LOCK_EX);
    if( $ret ){
        echo '執行成功'.PHP_EOL.$data.PHP_EOL;
        $pheanstalk->delete($job);
    }

    //暫停(不可能是百分百的準確,跟系統的排程、CPU時鐘週期等有一定關係)
    usleep(500000);
}

echo 'Success ~~'.PHP_EOL;

3、檢查服務狀態

<?php

//監控服務狀態
require_once('./vendor/autoload.php');

use Pheanstalk\Pheanstalk;

$pheanstalk = new Pheanstalk('127.0.0.1',11300);
$isAlive = $pheanstalk->getConnection()->isServiceListening(); 

var_dump($isAlive);

/**

可以開發監控面板,監控資料的,有多少tube,多少佇列,多少延遲等等


//檢視beanstalkd狀態
//var_dump($pheanstalk->stats());

//檢視有多少個tube
//var_dump($pheanstalk->listTubes());

//設定要監聽的tube
$pheanstalk->watch('test');

//取消對預設tube的監聽,可以省略
$pheanstalk->ignore('default');

//檢視監聽的tube列表
//var_dump($pheanstalk->listTubesWatched());

//檢視test的tube當前的狀態
//var_dump($pheanstalk->statsTube('test'));

*/

測試:

生產訊息:

$ php  producer.php 
{"uid":1499569740,"email":"[email protected]","message":"Hello World !!","dtime":"2017-07-09 11:09:00"}
Success ~~

php  producer.php 
{"uid":1499569742,"email":"[email protected]","message":"Hello World !!","dtime":"2017-07-09 11:09:02"}
Success ~~

 php  producer.php 
{"uid":1499569744,"email":"[email protected]","message":"Hello World !!","dtime":"2017-07-09 11:09:04"}
Success ~~

消費訊息:

$ php consumer.php 
執行成功
{"uid":1499569740,"email":"[email protected]","message":"Hello World !!","dtime":"2017-07-09 11:09:00"}
執行成功
{"uid":1499569742,"email":"[email protected]","message":"Hello World !!","dtime":"2017-07-09 11:09:02"}
執行成功
{"uid":1499569744,"email":"[email protected]","message":"Hello World !!","dtime":"2017-07-09 11:09:04"}

PHP監控

https://github.com/kr/beanstalkd/wiki/Tools
https://github.com/ptrofimov/beanstalk_console
https://github.com/jimbojsb/bstools

參考:
https://segmentfault.com/a/1190000002784775
http://www.jianshu.com/p/413676e1696f