您的位置:首页 > 其它

beanstalkd实现延迟任务

2016-08-03 00:00 337 查看
摘要: beanstalkd是一个c语言编写的开源的轻量级任务调度框架,以下就beanstalkd实现延迟任务功能进行简单说明

公司业务中需要用到延迟功能,时间误差要求小,多方调研,最后选择使用beanstalkd。文档将过程记录下来,以便回顾。
###beanstalkd 初探
beanstalkd是一个c语言编写的开源的轻量级任务调度框架。通过查询网上资料,大概了解下beanstalkd(网上相关资料并不是很多),在此感谢各位网页的分享贡献,主要参考资料地址如下:

官方文档
http://in355hz.iteye.com/blog/1395727) http://www.bytedancer.net/archives/21 http://www.fzb.me/2015-3-21-beanstalkd-protocol-chinese-version.html
还有很多网友的讨论,网址忘记记录了
#####1、安装
在官方文档上下载最新版beanstalkd安装
下载:wget -c https://github.com/kr/beanstalkd/archive/v1.10.tar.gz -O beanstalkd-1.10.tar.gz(-O是为了重命名,注意是大写)

解压:tar –xvzf beanstalkd-1.10.tar.gz

文档结构:解压后的文件包括beanstalkd的源码以及相关说明,查看readme文件中有使用说明,目录doc下的文件中protocol.txt有详细的命令使用说明

安装:cd beanstalkd-1.10

make

make install --prefix=/your dir/

beantalkd需要使用libevent,如果没有libevent,则需要先安装libevent

#####2、使用
启动:

进入到安装目录下的bin中,执行./beanstalkd -l host -p port,默认端口是11300,后台启动命令:nohup ./beanstalkd -b /data/log/beanstalkd -l host -p port 2>1& &

客户端:

github上有不同语言的客户端https://github.com/kr/beanstalkd/wiki/client-libraries不过好像都是各位使用者自己写了由几个官方维护的人收录的。Java客户端,经过比较和实际需求,最后选择了TrendrrBeanstalkhttps://github.com/dustismo/TrendrrBeanstalk

管理端:

使用的是beanstalk-mubinhttps://github.com/urbanairship/beanstalk-munin,一个基于python的管理小插件

第一个小测试:

TrendrrBeantalk中有简单好用的测试Demo,以下代码向beanstalkd中放入一条需要延迟60s的job

BeanstalkClient client = new BeanstalkClient("114.55.140.33", 11300, "tube1");
//优先级、延迟时间、TTR、消息体,延迟时间为60S
long jobId  = client.put(1l, 60, 50, "this is some data".getBytes());
System.out.println(jobId);

###beanstalkd进一步了解
官方提供的文档中protocol.txt已经有详细的描述,文档是英文的。有相关中文翻译http://www.fzb.me/2015-3-21-beanstalkd-protocol-chinese-version.html

#####管道(Tube)与任务(Job)
beanstalkd主要通过管道tube来存放同种类型的job,各个tube见互不干扰。任务提供者可使用useTube命令指定使用的tube,任务消费者使用watchTube命令监听Tube。beanstalkd提供一个默认的tube: default。
#####任务的生命周期
任务提供者通过put命令创建一个job,在整个生命周期中job有四个不同的生命状态:ready、reserved、delayed、buried,当执行delete命令后,job从beantalkd中删除,生命周期结束。

job的状态转换如下:

官方状态图:



自己理解的状态转换图:

经测试,处于任何状态的job都可以执行delete命令删除之<br>



#####任务持久化
Beanstalkd基于内存队列实现,重新启动队列置空。Beantalkd提供binlog进行数据存储,启动时指定备份文件,再次启动后数据能恢复到队列中。但数据过多时,重启加载时间过长。实际运用中,可以选择数据库为任务提供持久化存储。
###beanstalkd引入项目
beanstalkd具有延迟性、高性能、超时重发等性能,是一个做延迟任务的不错选择。性能方面,Facebook Causes应用9.5 million用户考验过。故将其引入项目。
#####改写客户端
使用的Java客户端TrendrrBeanstalk源码简单明了,根据自身需求在原来基础上进行了一定改写,定制属于自己的客户端
#####任务存储
为了便于维护和管理job,最后决定使用数据库对任务进行持久化存储,放弃其原生的binlog存储形式
#####定制接口,投入生产
现有业务已接入beanstalkd,使用情况待后期补充

#####最后,再次感谢各位网友的无私分享,才得以顺利进行。beanstalkd网上交流平台,查阅的知识都相对较少,附上在网上找到的QQ交流群:461605023
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  beanstalkd 延迟队列