当前位置:网站首页 > Java教程 > 正文

beanstalkd java教程



Beanstalkd 是一个轻量级的内存型队列。它是典型的类Memcached设计,协议和使用方式都是同样风格。
github:https://github.com/beanstalkd
官网:https://beanstalkd.github.io/

2.1 优先级
任务job可以有0~2^32 个优先级, 0 代表最高优先级,默认优先级为1024。

2.2 延迟 delay
比如说多长时间后执行某个任务

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

2.4 超时控制
为了防止某个consumer长时间占用任务但不能处理的情况,Beanstalkd为reserve操作设置了timeout时间,如果该consumer不能在指定时间内完成job,job将被迁移回READY状态,供其他consumer执行。

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

  • 用作延时队列:比如可以用于如果用户30分钟内不操作,任务关闭。
  • 用作定时任务:比如可以用于专门的后台任务。
  • 用作异步操作:这是所有消息队列都最常用的,先将任务仍进去,顺序执行。
  • 用作循环队列:用release命令可以循环执行任务,比如可以做负载均衡任务分发。
  • 用作兜底机制:比如一个请求有失败的概率,可以用Beanstalk不断重试,设定超时时间,时间内尝试到成功为止。

其实我们最重要的使用场景是把它作为延迟队列类使用,比如:

  1. 下订单后多长时间没有付款,要取消订单,并退库存
  2. 用户注册成功后,发送一封邮件
  3. 定期检查退款状态的订单是否退款成功

  • job:一个需要异步处理的任务,是Beanstalkd中的基本单元,需要放在一个tube中
  • tube:一个有名的队列,用来存储统一类型的job,是producer和consumer操作的对象。tube可以称为管道
  • producer:Job 的生产者,通过 put 命令来将一个 job 放到一个 tube 中
  • consumer:Job的消费者,通过 reserve/release/bury/delete 命令来获取 job 或改变 job 的状态

生产者生成任务,并根据业务需求将任务放到不同的管道中。比如与注册有关的任务放到注册管道中,和订单有关的任务放到订单管道中。

  • READY - 需要立即处理的任务,当延时 (DELAYED) 任务到期后会自动成为当前任务;
  • DELAYED - 延迟执行的任务, 当消费者处理任务后, 可以用将消息再次放回 DELAYED 队列延迟执行;
  • RESERVED - 已经被消费者获取, 正在执行的任务。Beanstalkd 负责检查任务是否在 TTR(time-to-run) 内完成;
  • BURIED - 保留的任务: 任务不会被执行,也不会消失,除非有人把它 "踢" 回队列;
  • DELETED - 消息被彻底删除。Beanstalkd 不再维持这些消息。

1.生产任务:

2. 消费任务:

consumer获取了当前 的job后,该job就会迁移到 状态,这样其他的consumer就不能在操作该job

3. 消费完任务后:

当consumer消费完该job后,可以选择delete, release 或者 bury 3种操作。

  • delete操作:job从系统消亡,之后不能在获取;
  • release操作:可以重新把该job状态迁移回 (也可以延迟状态 操作),使其他的consumer可以继 续获取和执行该job;
  • bury操作: 把job置为 状态,及是把该job休眠,等到需要的时候,还可以将休眠的 job 重新置为   状态, 也可以delete掉 buried 状态的job。

也就是说:当消费者处理完任务后,任务的状态可能是delete(删除,处理成功),可能是buried(预留,意味着先把任务放一边,等待条件成熟还要用),可能是ready,也可能是delayed,需要根据具体业务场景自己进行判断定义


示意图:
image.png

我们使用php来作为例子的练习

使用的PHP库:https://github.com/pheanstalk/pheanstalk
直接用composer进行安装
composer.json

 

5.1 生产者和消费者例子


生产者: producer.php

 

运行程序: php https://www.cnblogs.com/jiujuan/p/producer.php


消费者:consumer.php

 

运行程序:php https://www.cnblogs.com/jiujuan/p/consumer.php


5.2 监控例子


monitor.php

 

 

 

 

 

概念说明:

  • 任务优先级
    任务 () 可以有 0~2^32 个优先级, 0 代表最高优先级。  采用最大最小堆 () 处理任务优先级排序, 任何时刻调用  命令的消费者总是能拿到当前优先级最高的任务, 时间复杂度为 .
  • (, 预设的执行时间)
    消费者必须在预设的  () 时间内发送  /  /  改变任务状态;否则  会认为消息处理失败,状态改为 ,然后把任务交给另外的消费者节点执行。如果消费者预计在  时间内无法完成任务, 也可以发送  命令, 它的作用是让  重置该任务的  剩余执行时间.

6.5 消费者调用方法

1. 正常获取和执行job流程

 

2. 处理  状态的

 

https://github.com/beanstalkd/beanstalkd/blob/master/doc/protocol.zh-CN.md  
Beanstalkd中文协议
https://github.com/pheanstalk/pheanstalk php的beanstalkd库
https://segmentfault.com/a/03344 php操作beanstalkd
https://segmentfault.com/a/67218 消息队列beanstalkd源码详解

  • 上一篇: 百度云 java教程
  • 下一篇: java象棋制作教程
  • 版权声明


    相关文章:

  • 百度云 java教程2025-01-19 14:18:02
  • java jibx教程2025-01-19 14:18:02
  • java窗体教程鼠标2025-01-19 14:18:02
  • java图形界面教程 pdf2025-01-19 14:18:02
  • java前端视频教程2025-01-19 14:18:02
  • java象棋制作教程2025-01-19 14:18:02
  • java泰山版教程2025-01-19 14:18:02
  • java03接口教程2025-01-19 14:18:02
  • java教程手写2025-01-19 14:18:02
  • java例解教程2025-01-19 14:18:02