beanstalkd 的安装和使用

Beanstalkd 是什么

Beanstalk,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook Causes应用。

 

Beanstalkd 的安装

beanstalkd 安装方式有很多,这里强烈推荐本人亲自安装的最简单的方式,直接在linux环境下,依次运行下面命令即可:

  1. 源码安装

源码下载: http://kr.github.io/beanstalkd/download.html

$ sudo make
// 或
$ sudo make install 
// 或
$ sudo make install PERFIX=/usr/bin/beanstalkd

其他安装方式:

    2. 系统命令安装

在Unbuntu或Debian系统中,可以使用以下命令安装:

$ sudo apt-get install beanstalkd

在CentOS或RHEL系统中,首先需要更新EPEL源,然后再使用yum命令安装。

RHEL6中使用以下命令更新源:

su -c 'rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm'

RHEL7中:

su -c 'rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm'

执行安装:

$ sudo yum install beanstalkd

运行beanstalkd

$ beanstalkd -l 127.0.0.1 -p 11300 &

可选[OPTIONS]参数有:

    • -b DIR – wal目录
    • -f MS – 指定MS毫秒内的 fsync (-f0 为”always fsync”)
    • -F – 从不 fsync (默认)
    • -l ADDR – 指定监听地址(默认为:0.0.0.0)
    • -p PORT – 指定监听端口(默认为:11300)
    • -u USER – 用户与用户组
    • -z BYTE – 最大的任务大小(默认为:65535)
    • -s BYTE – 每个wal文件的大小(默认为:10485760)
    • -c – 压缩binlog(默认)
    • -n – 不压缩binlog
生产环境,推荐使用supervisor命令管理工具,防止服务挂掉
supervisor配置贴一下: 
安装supervisor本章就不讲了,可以参见这里有安装说明: 如何安装supervisor
在supervisor配置目录,新建一个 beanstalk.conf 文件,放入如下内容(相关路径和参数请根据自己具体项目调整)

[program:beanstalkd]
command=/usr/bin/beanstalkd -l 0.0.0.0 -p 11300 -c -z 6553500 -b /www/wwwlogs/beanstalkd/
process_name=%(program_name)s_%(process_num)02d
numprocs=1
autostart=true
startsecs = 5
autorestart=true
startretries=3
user=root
stopsignal=INT
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
stdout_capture_maxbytes=10MB
redirect_stderr=true
stdout_logfile=/www/wwwlogs/supervisor/supervisor_beanstalkd.log


 

Beanstalkd特性:

优先级(priority)

延迟(delay)

持久化(persistent data)

预留(buried)

任务超时重发(time-to-run)

===========================

◆优先级

支持0到2**32的优先级,值越小,优先级越高,默认优先级为1024。

◆持久化

可以通过binlog将job及其状态记录到文件里面,在Beanstalkd下次启动时可以通过读取binlog来恢复之前的job及状态。

◆分布式容错

分布式设计和Memcached类似,beanstalkd各个server之间并不知道彼此的存在,都是通过client来实现分布式以及根据tube名称去特定server获取job。

核心概念

Beanstalkd使用Producer-Consumer设计模式,无论是其协议结构还是使用方式都是类Memcached风格的。以下是Beanstalkd设计思想中核心概念:

job – 任务

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

Beanstalkd中的任务(job)类似于其它队列系统中的消息(message)的概念,详细参考任务生命周期

tube – 管道

管道即某一种类型的任务队列,其类似与消息的主题(topic),是ProducerConsumer的操作对象。

一个Beanstalkd中可以有多个管道, 每个管道都有自己的发布者(Producer)和消费者Consumer,管道之间互相不影响。

producer – 生产者

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

consumer – 消费者

任务(job)的消费者,通过reservereleaseburydelete命令来获取或改变job的状态。

 

任务生命周期

Beanstalkd中的任务(job)替代了消息(message)的概念,任务会有一系列的状态。任务的生命周期如下:

一个Beanstalkd任务可能会包含以下状态:

  • READY – 需要立即处理的任务。当producer直接put一个任务时,任务就处于READY状态,以等待consumer来处理。当延时 (DELAYED) 任务到期后会自动成为当前READY状态的任务
  • DELAYED – 延迟执行的任务。当任务被延时put时,任务就处于DELAYED状态。等待时间过后,任务会被迁移到READY状态。当消费者处理任务后,可以用将消息再次放回DELAYED队列延迟执行
  • RESERVED – 已经被消费者获取,正在执行的任务。当consumer获取了当前READY的任务后,该任务的状态就会迁移到RESERVED状态,这时其它的consumer就不能再操作该任务。Beanstalkd会检查任务是否在TTR(time-to-run)内完成
  • BURIED – 保留的任务,这时任务不会被执行,也不会消失。当consumer完成该任务后,可以选择deleterelease或者bury操作。delete后,任务会被删除,生命周期结束;release操作可以重新把任务状态迁移回READY状态或DELAYED状态,使其他consumer可以继续获取和执行该任务bury会拔任务休眠,等需要该任务时,再将休眠的任务kickREADY;也可能过delete删除BURIED状态的任务
  • DELETED – 消息被删除,Beanstalkd不再维持这些消息。即任务生命周期结束。

 

任务优先级(priority

任务 (job) 可以有0~2^32个优先级,0表示优先级最高。Beanstalkd采用最大最小堆 (Min-max heap) 处理任务优先级排序, 任何时刻调用 reserve 命令的消费者总是能拿到当前优先级最高的任务, 时间复杂度为 O(logn)

任务延时(delay

Beanstalkd中可以通过两种方式延时执行任务: 生产者发布任务时指定延时;或者当任务处理完毕后, 消费者再次将任务放入队列延时执行 (RELEASE with delay)。这种机制可以实现分布式定时任务,这种任务机制的优势是:如果某个消费者节点故障,任务超时重发(time-to-run)以保证任务转移到其它节点执行。

任务超时重发(time-to-run

Beanstalkd把任务返回给消费者后:消费者必须在预设的TTR(time-to-run) 时间内发送deleterelease或者bury命令改变任务状态;否则Beanstalkd会认为消息处理失败,然后把任务交给另外的消费者节点执行。如果消费者预计在TTR时间内无法完成任务, 可以发送touch命令,以使Beanstalkd重新计算TTR

任务预留(buried

RESERVED状态的任务因为某些原因无法执行时,消费者可以将其设置为buried状态,这时Beanstalkd会继续保留这些任务。在具备任务执行条件时,再通过kick将任务迁移回READY状态

Related Post

发表评论

电子邮件地址不会被公开。 必填项已用*标注