高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理。

设计中的核心概念:

job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中;
tube:一个有名的任务队列,用来存储统一类型的job,是producer和consumer操作的对象;
producer:job的生产者,通过put命令将一个job放入一个tube中;
consumer:job的消费者,通过reserve/release/bury/delete命令来获取job或改变job的状态;
job的生命周期
一个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状态。

几个很nice的特性
优先级:支持0到2^32的优先级,值越小,优先级越高,默认优先级为1024。
持久化:可以通过binlog将job及其状态记录到文件里面,在Beanstalkd下次启动时可以通过读取binlog来恢复之前的job及状态。
分布式容错:分布式设计和Memcached类似,beanstalkd各个server之间并不知道彼此的存在,都是通过client来实现分布式以及根据tube名称去特定server获取job。
超时控制:为了防止某个consumer长时间占用任务但不能处理的情况,Beanstalkd为reserve操作设置了timeout时间,如果该consumer不能在指定时间内完成job,job将被迁移回READY状态,供其他consumer执行。
不足:在使用中发现一个Beanstalkd尚无提供删除一个tube的操作,只能将tube的job依次删除,并让Beanstalkd来自动删除空tube。还有就是Beanstalkd不支持客户端认证机制(开发者将应用场景定位在局域网)。

最新文章

  1. oracle 存储过程
  2. 使用bat/vbs/ahk对Windows下进行自动化操作
  3. Servlet里面url-pattern的通配符*的使用规则
  4. (译)详解javascript立即执行函数表达式(IIFE)
  5. hdu 1561 The more, The Better(树形dp,基础)
  6. C语言学习总结(二) 运算流程
  7. 关于c++primer的一个代码错误
  8. oracle复制表数据,复制表结构
  9. 上传文件大小限制,webconfig和IIS配置大文件上传
  10. Web.config 自动替换值
  11. pod 使用详解
  12. 【转】Yelp是如何实现每天运行数百万个测试的
  13. 【Codeforces Round 1129】Alex Lopashev Thanks-Round (Div. 1)
  14. Linux的7个运行级别
  15. [No0000129]WPF(1/7)开始教程[译]
  16. saliency 2015-2016的论文、代码
  17. html中文显示乱码的处理方法
  18. (转)Python——functools
  19. ucosii事件控制块------消息邮箱与消息队列
  20. WPF 使用附加属性增加控件属性

热门文章

  1. 哪种缓存效果高?开源一个简单的缓存组件j2cache
  2. PHP 5.6 编译安装选项说明
  3. 关于CSS inline-block、BFC以及外边距合并的几个小问题
  4. django 学习第一天搭建环境
  5. Atitit  godaddy 文件权限 root权限设置
  6. Android快乐贪吃蛇游戏实战项目开发教程-05虚拟方向键(四)四个三角形按钮
  7. 创建maven项目(cmd 命令)
  8. ASP.NET 5 Beta 7 版本
  9. Disque:Redis之父新开源的分布式内存作业队列
  10. 【腾讯Bugly干货分享】程序员们也该知道的事——“期权和股票”