• 特征

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

    2. 延时任务 (delay):有两种方式可以延时执行任务 (job): 生产者发布任务时指定延时;或者当任务处理完毕后, 消费者再次将任务放入队列延时执行 (RELEASE with <delay>)。这种机制可以实现分布式的 java.util.Timer,这种分布式定时任务的优势是:如果某个消费者节点故障,任务超时重发 (time-to-run) 能够保证任务转移到另外的节点执行。

    3. 任务超时重发 (time-to-run):Beanstalkd 把任务返回给消费者以后:消费者必须在预设的 TTR (time-to-run) 时间内发送 delete / release/ bury 改变任务状态;否则 Beanstalkd 会认为消息处理失败,然后把任务交给另外的消费者节点执行。如果消费者预计在 TTR (time-to-run) 时间内无法完成任务, 也可以发送 touch 命令, 它的作用是让 Beanstalkd 从系统时间重新计算 TTR (time-to-run).

    4. 任务预留 (buried):如果任务因为某些原因无法执行, 消费者可以把任务置为 buried 状态让 Beanstalkd 保留这些任务。管理员可以通过 peek buried 命令查询被保留的任务,并且进行人工干预。简单的, kick <n> 能够一次性把 n 条被保留的任务踢回队列。

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

  • 基本概念

    1. job: 需要异步处理的任务,是Beanstalkd中的基本单元,需要放在一个tube中。
    2. tube: 任务队列,用来存储统一类型的job,是producer和consumer操作的对象。
    3. producer: job的生产者,通过put命令来将一个job放到一个tube中。
    4. consumer: job的消费者,通过reserve|release|bury|delete命令来获取job或改变job的状态。
  • job状态的流转流程

    • 概述:

      同Memcached的设计类似,Beanstalkd的协议设计比较简单明了,当一个任务被添加进Beanstalkd的队列里时,它的生命周期如上图所示。可以看到job有READY,RESERVED,DELAYED,BURIED四个状态;当一个producer直接put一个job之后,该job便进入了READY状态,等待consumer来处理。如果选择延迟put,job就先到DELAYED状态,等待指定时间后才迁移到READY状态;当consumer获取到该job后,该job的状态就从READY迁移RESERVED,这样其他的consumer就不能再操作该job;当consumer完成该job后,可以选择delete,release或者bury操作;delete之后,job从系统消亡,之后不能再获取;release操作可以重新把该job状态迁移回READY(也可以延迟该状态迁移操作),使其他的consumer可以继续获取和执行该job; Beanstalkd中有一到多个tube,每个tube都有一个ready队列和一个delay队列组成,一个job的生命周期只会存在于一个tube中。consumer要从某个tube获取job,可以向其发送watch命令,如果consumer想忽略某些tube,则可以像其发送ignore命令,consumer感兴趣的tube集合称之为wath list,显然,一个consumer获取的job肯定是来自它的watch list当中。当一个consumer没有指定tube名称时,它有一个默认的watch list称之为default。同理,如果producer提交job时没有指定tube名称,则默认添加到default当中。 当tube被引用时,它们会根据需要自动创建。如果一个tube中是空的(即它不包含REDY,DELAYED,BURIED jobs),并且没有consumer连接到它,它就会被删除。

      1. READY - 需要立即处理的任务,当延时 (DELAYED) 任务到期后会自动成为当前任务

      2. DELAYED - 延迟执行的任务, 当消费者处理任务后, 可以用将消息再次放回 DELAYED 队列延迟执行

      3. RESERVED - 已经被消费者获取, 正在执行的任务(将不会被别的消费者拿到)。Beanstalkd 负责检查任务是否在 TTR(time-to-run) 内完成

      4. BURIED - 保留的任务: 任务不会被执行,也不会消失,除非有人把它 "踢" 回队列

      5. DELETED - 消息被彻底删除。Beanstalkd 不再维持这些消息

  • Beanstalkd 协议

    1. 生产类 - use <tube> / put <priority> <delay> <ttr> [bytes]:  生产者用 use 选择一个管道 (tube), 然后用 put 命令向管道发布任务 (job).

    2. 消费类 - watch <tubes> / reserve / delete <id> / release <id> <priority> <delay> / bury <id> / touch <id>
      消费者用 watch 选择多个管道 (tube), 然后用 reserve 命令获取待执行的任务,这个命令是阻塞的。客户端直到有任务可执行才返回。当任务处理完毕后, 消费者可以彻底删除任务 (DELETE), 释放任务让别人处理 (RELEASE), 或者保留 (BURY) 任务。

    3. 维护类 - peek job / peek delayed / peek ready / peek buried / kick <n>用于维护管道内的任务状态, 在不改变任务状态的条件下获取任务。可以用消费类命令改变这些任务的状态。被保留 (buried) 的任务可以用 kick 命令 "踢" 回队列。

  • Beanstalkd客服端

Beanstalkd介绍的更多相关文章

  1. 队列:Beanstalkd介绍

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

  2. 【转】Beanstalkd 队列简易使用

    Beanstalkd一个高性能分布式内存队列系统   之前在微博上调查过大家正在使用的分布式内存队列系统,反馈有Memcacheq,Fqueue, RabbitMQ, Beanstalkd以及link ...

  3. Beanstalkd消息队列 -- php类Pheanstalk使用

    业务场景 商城订单生成30分钟后 如果未支付关闭订单 解决办法 可以使用延迟消息队列   这里我们用的是beanstalkd Beanstalkd介绍 Beanstalk,一个高性能.轻量级的分布式内 ...

  4. PHP7 生产环境队列 Beanstalkd 正确使用姿势

    应用场景 为什么要用呢,有什么好处?这应该放在最开头说,一件东西你只有了解它是干什么的,适合干什么,才能更好的与自己的项目相结合,用到哪里学到哪里,学了不用等于不会,我们平时就应该多考虑一些这样的问题 ...

  5. beanstalkd 消息队列

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

  6. Beanstalkd

    摘要by ck:beanstalkd  和  kafka的本质区别是什么? Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web ...

  7. Beanstalkd 一个高性能分布式内存队列系统

    需要一个分布式内存队列,能支持这些特性:任务不重不漏的分发给消费者(最基础的).分布式多点部署.任务持久化.批量处理.错误重试..... 转载:http://rdc.taobao.com/blog/c ...

  8. MQ介绍 & 实例

    阅读目录 定义 优秀MQ特点 产品比较 实例(简单的实战) 关于消息队列与分布式的那些事 定义: 消息队列(MQ)是一种应用程序对应用程序的通信方法,应用程序通过队列进行通信,而不是通过直接调用彼此来 ...

  9. Beanstalkd 的理解

    Beanstalkd 的理解 Beanstalkd 是一个轻量级的内存型队列,利用了和Memcache 类似的协议.其官网beanstakkd官网 下方的感谢语说: Many thanks to me ...

随机推荐

  1. UML解惑:图说UML中的六大关系--转

    UML定义的关系主要有六种:依赖.类属.关联.实现.聚合和组合.这些类间关系的理解和使用是掌握和应用UML的关键,而也就是这几种关系,往往会让初学者迷惑.这里给出这六种主要UML关系的说明和类图描述, ...

  2. 通过源码安装最新版Git

    下载源码 到Git的Github主页上下载最新的源码到本地,解压并进入目录. 编译安装 cd 你的git源码目录 autoconf ./configure make 第一个报错 报错内容: usr/b ...

  3. UVA 11770 Lighting Away

    RunID User Problem Result Memory Time Language Length Submit Time 2482977 zhyfzy J Accepted 0 KB 138 ...

  4. 异步tcp通信——APM.Core 服务端概述

    为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给 ...

  5. python复制--笔记

    对象引用: >>> songs = ["Bee","Core","Love"] >>> bat = so ...

  6. tomcat startup.sh提示java.lang.OutOfMemoryError: PermGen space

    JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m"if [ -z "$LOGGING_MANAGER& ...

  7. JQuery 代码

    http://baike.baidu.com/view/136475.htmhttp://www.cnblogs.com/gleamy_ming/archive/2009/04/29/1446492. ...

  8. java中的final, finally, finalize的区别

    final修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为abstract的,又被声明为final的.将变量或方法声明为fin ...

  9. 如何分析apache日志[access_log(访问日志)和error_log(错误日志)]

    如何分析apache日志[access_log(访问日志)和error_log(错误日志)] 发布时间: 2013-12-17 浏览次数:205 分类: 服务器 默认Apache运行会access_l ...

  10. 反序列化 DateTime对象问题

      今天在Android的Json反序列化过程中,Date类型无法转化成自己想要的格式,鉴于之前在C#的反序列话中也遇到过这个问题,解决的同时,顺手做个总结,供自己及需要的人日后查阅.       将 ...