一个延时队列服务Beanstalkd

安装和启动:
yum -y install beanstalkd

配置文件默认在 /etc/sysconfig/beanstalkd

nohup /usr/local/bin/beanstalkd -l 0.0.0.0 -b /mnt/beanstalkd &


特点:
拉模式:消费者需要主动从服务器拉取消息数据;
tube:类似于消息主题topic,一个beanstalkd中可以支持多个tube,每个tube都有自己的producer和consumer;多个生产者可以往同一个tube生产job,多个消费者也能监听同一个tube获取job;
job:代替了传统的message,与消息最大的区别是,job有多种状态;
conn:代表一个客户端链接;
优先级:job可以有0~2^32个优先级,0代表最高优先级,beanstalkd使用堆处理job的优先级排序,因此reserve命令的时间复杂度是O(logN);
延时:生产者发布任务时可以指定延时,到达延迟时间后,job才能被消费者消费;
超时机制:消费者从beanstalkd获取一个job后,必须在预设的 TTR (time-to-run) 时间内处理完任务,并发送 delete / release/ bury 命令改变任务状态;否则 Beanstalkd 会认为消息消费失败,重置job状态,使其可以被其他消费者消费。如果消费者预计在 TTR (time-to-run) 时间内无法完成任务, 也可以发送 touch 命令, 它的作用是让 Beanstalkd 从重新计时TTR;
暂停:pause命令可以暂停当前tube,暂停时期内所有job都不能够被消费者消费;
状态:
READY:需要立即处理的任务,当延时 (DELAYED) 任务到期后会自动成为当前任务;
DELAYED:延迟执行的任务,;
RESERVED:已经被消费者获取, 正在执行的任务,Beanstalkd 负责检查任务是否在 TTR(time-to-run) 内完成;
BURIED:保留的任务: 任务不会被执行,也不会消失,除非有人将他修改为其他状态;
DELETED:消息被彻底删除。Beanstalkd 不再维持这些消息;
状态转移图:


细节:
beanstalkd如何维护job的状态:tube有3个集合delay、ready和 buried分别存放对应状态的job,conn的reserved_jobs集合存储状态为reserved的job(消费者获取一个job后,job的状态才会改变为reserved,因此这个集合由conn维护)
delay状态的job怎么修改为ready:delay集合是一个按照时间排序的最小堆,beanstalkd不定时循环从堆根节点获取job,校验是否需要改变其状态未ready
如何实现优先级:只有ready状态的job才能被消费者获取消费,ready集合是一个按照优先级排序的最小堆,根节点始终是优先级最高得job
消费者持续拉模式实现:消费者使用reserve命令获取job,beanstalkd检查消费者监听的所有tube,查找到ready的job即返回,否则阻塞消费者知道有ready状态的job产生为止
telnet 127.0.0.1 11300
命令:
use <tube>:使用指定tube
watch <tube>:监听指定tube
ignore <tube>:取消监听指定tube
list-tubes:列出所有的tube
list-tube-used:列出当前客户端使用的tube
list-tubes-watched:列出当前客户端监听的所有tube
pause-tube <tube>:暂停指定tube,暂停期间所有job都不能再被消费者消费
put <pri><delay><ttr><data-size><data>:生产者发布job
reserve <id> <data-size><data>:获得堆顶的job,如果客户端监视的所有tube都没有ready状态的tube,阻塞客户端;否则返回job
reserve-with-timeout <timeout>:同reserve,只是设置最大阻塞时间
peek <id>:返回id对应的job
peek-ready:返回下一个ready的job
peek-delay:返回剩余时间最短的delay状态的job
peek-buried:返回下一个buried列表中的job
release <id> <pri> <delay>:将一个reserved状态的job重置为ready状态
bury <id> <pri>:将job的状态设置为buried
kick:将buried状态的job迁移为ready,或将delay状态的job迁移为ready
kick-job <id>:将一个job的状态迁移为ready
delete <id>:删除一个job
touch <id>:客户端reserve获取job后,发现没有足够时间处理此job,发送touch命令,放服务器重新开始计时TTR
stats-job <id>:查询job状态
stats-tube <tube>:查询tube状态
stats:查询服务器统计信息
quit:退出

官方文档:https://raw.githubusercontent.com/beanstalkd/beanstalkd/master/doc/protocol.txt

composer扩展:https://packagist.org/packages/pda/pheanstalk

大佬写的扩展应用例子:https://www.jianshu.com/p/82c4c6fee450
————————————————
版权声明:本文为CSDN博主「AbleYu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/why444216978/article/details/102152043

发布了93 篇原创文章 · 获赞 2 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_32783703/article/details/103695607