Beanstalkd 使用记录

1、安装

一、官网

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

二、安装

yum install beanstalkd --enablerepo=epel

三、启动

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

-b 开启binlog,断电后重启会自动恢复任务。github

四、配置文件

/etc/sysconfig/beanstalkd

2、基本概念

一、Beanstalkd设计里面的核心概念:

  • job:一个须要异步处理的任务,是 Beanstalkd 中的基本单元,须要放在一个 tube 中。web

  • tube:一个有名的任务队列,用来存储统一类型的 job,是 producer 和 consumer 操做的对象。chrome

  • producer:Job 的生产者,经过 put 命令来将一个 job 放到一个 tube 中。app

  • consumer:Job的消费者,经过 reserve/release/bury/delete 命令来获取 job 或改变 job 的状态。异步

二、job 的生命周期

图片描述

当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) 任务到期后会自动成为当前任务;google

  • DELAYED - 延迟执行的任务, 当消费者处理任务后, 能够用将消息再次放回 DELAYED 队列延迟执行;spa

  • 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执行。

3、Client Libraries For PHP

项目地址:https://github.com/pda/pheanstalk/

一、Producer 示例:向队列中添加job

$pheanstalk = new Pheanstalk_Pheanstalk('127.0.0.1');

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

二、Consumer 示例:从队列中取出job

$job = $pheanstalk ->watch('tubeName') ->ignore('default') ->reserve();

echo $job->getData();

$pheanstalk->delete($job);

三、检查服务状态

$isAlive = $pheanstalk->getConnection()->isServiceListening(); //返回 true 或 false

四、获取某一 tube 的数据

try{
    $tubeStatus = $pheanstalk->statsTube('tubeName');
} catch (Exception $e){
    if($e->getMessage()=='Server reported NOT_FOUND'){     //tube 不存在
        $current_jobs_ready = 0;
    }
}

4、其余

一、PHP 版控制台

https://github.com/ptrofimov/beanstalk_console

二、Chrome 插件

https://chrome.google.com/webstore/detail/beanstalkd-dashboard/dakkekjnlffnecpmdiamebeooimjnipm

5、参考资料

  1. https://github.com/kr/beanstalkd/wiki/faq

  2. http://csrd.aliapp.com/?p=1201

相关文章
相关标签/搜索