最新消息:

Deepin 使用 beanstalkd 教程

PHP 761浏览 0评论

1、基本概念

1.1、什么是Beanstalkd?

  Beanstalkd 是一个轻量级消息中间件,它最大特点是将自己定位为基于管道 (tube) 和任务 (job) 的工作队列。

  Beanstalkd 支持任务优先级 (priority), 延时 (delay), 超时重发 (time-to-run) 和预留 (buried), 能够很好的支持分布式的后台任务和定时任务处理。它的内部采用libevent,服务器-客户端之间采用类似Memcached的轻量级通讯协议,因此性能很高(enque: 9000 jobs/second, worker: 5200 jobs/second)

  尽管是内存队列, Beanstalkd 提供了 binlog 机制, 当重启 beanstalkd 时,当前任务状态能够从纪录的本地 binlog 中恢复。Beanstalkd支持过有9.5 million用户的Facebook Causes应用。后来开源,现在有PostRank大规模部署和使用,每天处理百万级任务。Beanstalkd是典型的类Memcached设计,协议和使用方式都是同样的风格,所以使用过Memcached的用户会觉得Beanstalkd似曾相识。

  Beanstalkd支持的语言有很多,可以参考这里:https://github.com/kr/beanstalkd/wiki/client-libraries

1.2、Beanstalkd设计的核心概念?

job

  一个需要异步处理的任务,是Beanstalkd中的基本单元,需要放在一个tube中。

tube

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

producer

  Job的生产者,通过put命令来将一个job放到一个tube中。

consumer

  Job的消费者,通过reserve/release/bury/delete命令来获取job或改变job的状态。

1.3、Beanstalkd中Job的生命周期介绍

  Beanstalkd的流程如下图:

  • 当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 buride状态的job

  正是有这些有趣的操作和状态,才可以基于此做出很多意思的应用,比如要实现一个循环队列,就可以将RESERVED状态的job休眠掉,等没有READY状态的job时再将BURIED状态的job一次性kick回READY状态。

1.4、Beanstalkd有什么不足?

  Beanstalkd 没有提供主备同步 + 故障切换机制, 在应用中有成为单点的风险。实际应用中,可以用数据库为任务 (job) 提供持久化存储。 和 Memcached 类似, Beanstalkd 依赖 libevent 的单线程事件分发机制, 不能有效利用多核 cpu 的性能。这一点可以通过单机部署多个实例克服。

  

  一个Beanstalkd尚无提供删除一个tube的操作,只能将tube的job依次删除,并让Beanstalkd来自动删除空tube。还有就是Beanstalkd不支持客户端认证机制(开发者将应用场景定位在局域网)。

  Beanstalk速度非常快,协议简单,占用内存空间少,而且支持持久化。唯一的不足是挂了之后恢复慢,3G日志数据恢复了十多分钟。

2、Beanstalkd的官网在哪里?

  http://kr.github.io/beanstalkd/

3、Beanstalkd在哪里下载?

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

4、如何安装Beanstalkd?

  使用下面的命令进行安装,同时查看版本:

sudo apt-get install beanstalkd
beanstalkd -v
beanstalkd 1.10

  Beanstalkd可以使用以下命令停止和启动:

sudo service beanstalkd stop  #停止
sudo service beanstalkd start #启动

  通过apt-get安装后的配置文件目录在/etc/default/beanstalkd,里面描述了Beanstalkd监听的地址和端口

cat /etc/default/beanstalkd

## Defaults for the beanstalkd init script, /etc/init.d/beanstalkd on
## Debian systems.

BEANSTALKD_LISTEN_ADDR=127.0.0.1
BEANSTALKD_LISTEN_PORT=11300

# You can use BEANSTALKD_EXTRA to pass additional options. See beanstalkd(1)
# for a list of the available options. Uncomment the following line for
# persistent job storage.
#BEANSTALKD_EXTRA="-b /var/lib/beanstalkd"

4.1、安装beanstool管理工具

  beanstool是一个Beanstalkd管理工具,不需要任何依赖就可以使用,是用Golang编写的。

wget https://github.com/src-d/beanstool/releases/download/v0.2.0/beanstool_v0.2.0_linux_amd64.tar.gz 

tar -xvzf beanstool_v0.2.0_linux_amd64.tar.gz

sudo cp beanstool_v0.2.0_linux_amd64/beanstool /usr/local/bin/

4.2、PHP使用 beanstalkd

通过 composer 安装:

composer require pda/pheanstalk

image.png

PHP 代码中使用:

require "vendor/autoload.php";

use Pheanstalk\Pheanstalk;

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

$result = $pheanstalk->stats();

print_r($result);

结果如下:

Pheanstalk\Response\ArrayResponse Object
(
    [_name:Pheanstalk\Response\ArrayResponse:private] => OK
    [storage:ArrayObject:private] => Array
        (
            [current-jobs-urgent] => 0
            [current-jobs-ready] => 0
            [current-jobs-reserved] => 0
            [current-jobs-delayed] => 0
            [current-jobs-buried] => 0
            [cmd-put] => 0
            [cmd-peek] => 0
            [cmd-peek-ready] => 0
            [cmd-peek-delayed] => 0
            [cmd-peek-buried] => 0
            [cmd-reserve] => 0
            [cmd-reserve-with-timeout] => 0
            [cmd-delete] => 0
            [cmd-release] => 0
            [cmd-use] => 0
            [cmd-watch] => 0
            [cmd-ignore] => 0
            [cmd-bury] => 0
            [cmd-kick] => 0
            [cmd-touch] => 0
            [cmd-stats] => 3
            [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
            [total-jobs] => 0
            [max-job-size] => 65535
            [current-tubes] => 1
            [current-connections] => 1
            [current-producers] => 0
            [current-workers] => 0
            [current-waiting] => 0
            [total-connections] => 3
            [pid] => 24080
            [version] => 1.10
            [rusage-utime] => 0.000000
            [rusage-stime] => 0.002915
            [uptime] => 1813
            [binlog-oldest-index] => 0
            [binlog-current-index] => 0
            [binlog-records-migrated] => 0
            [binlog-records-written] => 0
            [binlog-max-size] => 10485760
            [id] => 50293a0a4a7b9e1a
            [hostname] => wecot
        )

)

使用 beanstalkd 的生产消费demo

https://github.com/wecot/syncTask.git

转载请注明:微刻 blog.wecot.cn » Deepin 使用 beanstalkd 教程

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址