Beanstalk(内存队列)

版权声明:本文虽为博主原创文章,但你转了博主也不知道,所以放心的转吧。 https://blog.csdn.net/javaer_lee/article/details/87939040

Beanstalk是一个高性能、轻量级的、分布式的、内存型的消息队列系统。最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟。其实Beanstalkd是典型的类Memcached设计,协议和使用方式都是同样的风格。其基本设计思想很简单:高性能离不开异步,异步离不开队列,而内部都是生产者-消费者模式的。

Beanstalk介绍:

  那下面开始说beanstalk了。首先说beanstalk其实并不是JMS规范的,也并不严格遵守AMQP协议。有人说Beanstalk之于RabbitMQ,就好比Nginx之于Apache。它更简单,轻量级,高性能,易使用。但是相比kafka,数据处理能力还是有差距,所以我们现在其实在逐渐替代它。但它有些很易用的特殊功能,后面会讲到。

  Beanstalk主要包括4个部分。

  1> job:一个需要异步处理的任务,需要放在一个tube中。

  2> tube:一个有名的任务队列,用来存储统一类型的job,是producer和consumer操作的对象。

  3> producer:job的生产者,通过put命令来将一个job放到一个tube中。

  4> consumer:job的消费者,通过reserve、release、bury、delete命令来获取job或改变job的状态。

  刚才说Beanstalk有一些特殊的好用功能。那就是它支持任务优先级(priority)、延时(delay)、超时重发(time-to-run)和预留(buried),能够很好的支持分布式的后台任务和定时任务处理。这些特性是和beanstalk工作过程密切相关。

  Beanstalk的一个job的生命周期有READY、RESERVED、DELAYED、BURIED四种。

  当producer直接put一个job时,job就是READY状态,等待consumer来处理。如果选择延迟put,job就先到DELAYED状态,到指定时间再READY。consumer获取了READY的job,此状态就为RESERVED。这样其他consumer不能再操作此job。当consumer完成该job后,可以选择delete、release或者bury。

  delete之后,job不能再获取。release的job可以重新迁移或延迟迁移回READY。bury的job可以被休眠,需要的时候再READY或者delete掉。

Beanstalk使用场景:

  用作延时队列:比如可以用于如果用户30分钟内不操作,任务关闭。

  用作循环队列:用release命令可以循环执行任务,比如可以做负载均衡任务分发。

  用作兜底机制:比如一个请求有失败的概率,可以用Beanstalk不断重试,设定超时时间,时间内尝试到成功为止。

  用作定时任务:比如可以用于专门的后台任务。

  用作异步操作:这是所有消息队列都最常用的,先将任务仍进去,顺序执行。

猜你喜欢

转载自blog.csdn.net/javaer_lee/article/details/87939040
今日推荐