———————————————–正文分割线————————————————-
设计思想
高性能离不开异步,异步离不开队列,而其内部都是Producer-Comsumer模式的原理。
图1 Producer-Comsumer模式
应用
Beanstalkd,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook Causes应用。后来开源,现在有PostRank大规模部署和使用,每天处理百万级任务。Beanstalkd是典型的类Memcached设计,协议和使用方式都是同样的风格,所以使用过memcached的用户会觉得Beanstalkd似曾相识。
核心概念
Beanstalkd设计里面的核心概念:
- job
- tube
- producer
- consumer
Beanstalkd中一个job的生命周期如图2所示。一个job有READY, RESERVED, DELAYED, BURIED四种状态。当producer直接put一个job时,job就处于READY状态,等待consumer来处理,如果选择延迟put,job就先到DELAYED状态,等待时间过后才迁移到READY状态。consumer获取了当前READY的job后,该job的状态就迁移到RESERVED,这样其他的consumer就不能再操作该job。当consumer完成该job后,可以选择delete, release或者bury操作;delete之后,job从系统消亡,之后不能再获取;release操作可以重新把该job状态迁移回READY(也可以延迟该状态迁移操作),使其他的consumer可以继续获取和执行该job;有意思的是bury操作,可以把该job休眠,等到需要的时候,再将休眠的job kick回READY状态,也可以delete BURIED状态的job。正是有这些有趣的操作和状态,才可以基于此做出很多意思的应用,比如要实现一个循环队列,就可以将RESERVED状态的job休眠掉,等没有READY状态的job时再将BURIED状态的job一次性kick回READY状态。
图2 Beanstalkd中job的生命周期
特性
Beanstalkd基于的源码安装和使用很简单,在此略过。这里重点介绍一下其几个很nice的特性。
- 优先级
- 持久化
- 分布式容错
- 超时控制
不足
在使用中发现一个Beanstalkd尚无提供删除一个tube的操作,只能将tube的job依次删除,并让Beanstalkd来自动删除空tube。还有就是Beanstalkd不支持客户端认证机制(开发者将应用场景定位在局域网)。
后续工作
- 介绍Beanstalkd的命令和使用
- 翻译Beanstalkd协议
- 分析Beanstalkd源码
http://kr.github.com/beanstalkd/
http://adam.heroku.com/past/2010/4/24/beanstalk_a_simple_and_fast_queueing_backend/
http://nubyonrails.com/articles/about-this-blog-beanstalk-messaging-queue
http://www.igvita.com/2010/05/20/scalable-work-queues-with-beanstalk/
最新评论