原文转自:http://liaofeng-xiao.iteye.com/blog/1990577
最直接的学习Beanstalkd的方式就是读官方协议文档:
https://raw.github.com/kr/beanstalkd/master/doc/protocol.txt

beanstalkd是一个快速的、通用目的的work queue。协议简单,是个轻量级的消息中间件。

“(Beanstalkd) is a simple, fast workqueue service. Its interface is generic, but was originally designed for reducing the latency of page views in high-volume web applications by running time-consuming tasks asynchronously.”

beanstalkd的最初设计意图是在高并发的网络请求下,通过异步执行耗时较多的请求,及时返回结果,减少请求的响应延迟。

使用场景:

* long running task
* intensive task

examples:

* send email
* processing image/video

advantages:
1. asynchronous/unblock
2. scales easy: run more workers. workers can be distributed across a number of machines
3. call functions written in other languages

How it works:

* Queues: Acts as a job buffer between producer and worker
* Daemon: when job is released to a worker
* Producer: create the job and put it to the queue
* Worker: get a job from the queue, and deal with it

Comparison:

1. Queueing with a database: not so well suited, especially with high transactions, it costs locking to ensure only on worker can get a job.
2. ActiveMQ
3. RabbitMQ: written in Erlang, brought by VMVare
4. Amazon SQS
5. Gearman, by livejournal
6. ZeroMQ
7. Sparrow

Killer Features:
* tube
* priority
* delays
* TTR

它支持优先级队列(priority queue)、延迟(delay)、超时重发(time-to-run)和预留(buried),能够很好的支持分布式的后台任务和定时任务处理。
它的内部采用libevent,服务器-客户端之间采用类似Memcached的轻量级通讯协议,因此性能很高(enque: 9000 jobs/second, worker: 5200 jobs/second)
尽管是内存队列,beanstalkd提供了binlog机制,当重启beanstalkd,当前任务的状态能够从记录的本地binlog中恢复。

tube(管道):
类似于topic,一个Beanstalkd可以支持多个tube,每个tube有自己的producer/worker,tube之间相互不影响。一个job的生命周期永远都会在同一个tube中。

job优先级:job可以有0~2^32个优先级,0代表最高优先级,小于1024的优先级beanstalkd认为是urgent。beanstalkd使用最大最小堆来实现优先级排序,任何时刻调用reserve命令,拿到的都是优先级最高的job,时间复杂度是O(longn)。

delay job: 两种方式可以实现delay:

* put with delay
* release with delay

但是,什么情况下使用delay job?

任务超时重发:time-to-run
如果一个client/worker/consumer获取到job之后,在ttr时间内没有处理完,即,没有通过delete/release/bury改变任务的reserve状态,beanstalkd认为消息处理失败。如果worker在预计在ttr时间内不能处理完job,可以发送touch命令,让beanstalkd从现在开始重新计算ttr。

buried(预留任务):
如果job因为某些原因暂时无法执行,worker可以先把job置为buried状态。buried状态的job不能被任何worker reserve。管理员可以通过peek buried查看有多少预留job,进行人工干预。kick <n>可以一次线的把n条buried job踢回到ready状态。

beanstalkd协议:
Beanstalkd采用类似Memcached的文本协议,客户端和服务器通信通过文本进行。这些通信的命令可以总结为以下三类:

1. producer
a. use <tube>
b. put <priority> <delay> <ttr> [bytes]
2. worker
a. watch <tube>
b. reserve: it will block if no job is ready. or reserve-with-timeout, set timeout to 0, beanstalkd will return a job immediately, or none.
c. delete <id>
d. release <id> <priority> <delay>
e. bury <id>
f. touch <id>

3. maintainer
a. peek job
b. peek delayed
c. peek ready
d. peek buried
e. kick <n>

状态转换图:

put with delay release with delay
----------------> [DELAYED] <------------.
| |
kick | (time passes) |
| |
put v reserve | delete
-----------------> [READY] ---------> [RESERVED] --------> *poof*
^ ^ | |
| \ release | |
| `-------------' |
| |
| kick |
| |
| bury |
[BURIED] <---------------'
|
| delete
`--------> *poof*

Beanstalkd不足:
1. 没有提供主从同步+故障切换机制,在应用中有可能成为单点的风险。在实际应用中,可以使用数据库为job提供持久化存储。

2. 和Memcached类似,Beanstalkd依赖libevent单线程事件分发机制,不能有效的利用多核cpu的性能。这一点可以通过单机部署多个实例客服。

本地体验:

1. 运行beanstalkd:beanstalkd

2. telnet localhost 11300
连上后可以发送各种命令:stats

Questions:

1. if a job runs out TTR, the worker will stop processing the job? or two workers may be working on the same job.
definitely is.
2. how to experience Beanstalkd conviently in local, for example, three terminals: producer/worker/maintainer
use telnet please(use `quit` to quit terminal), or use beanstalkc client.

producer:
telnet localhost 11300
stats-tube default
use today
put 1000 0 10 11
hello world

worker:
telnet localhost 11300
watch today
ignore default
reserve( or reserve-with-timeout 0)
bury 1000 <id>
kick <number>
delete <id>

maintainer:
stats-tube today
peek <id>
stats-job <id>
peek-ready [如果返回not-found,说明该tube还没有ready的job(使用use切换tube)
peek-delayed
job-stats <id>
kick <number>

Refers:

1. Protocol: https://raw.github.com/kr/beanstalkd/master/doc/protocol.txt, or https://github.com/kr/beanstalkd/blob/master/doc/protocol.md
2. PPT: http://alister.github.io/presentations/Beanstalkd/
3. http://nubyonrails.com/articles/about-this-blog-beanstalk-messaging-queue

Beanstalkc:
https://github.com/earl/beanstalkc/

Beanstalkc is a simple beanstalkd client librayr for Python. beanstalkd is a fast, in-memory workqueue service.
Beanstalkc depends on PyYAML, but there are ways to avoid this dependency.
Beanstalkc is pure python, and is compatible with eventlet and gevent.

Usage:
import beanstalkc
beanstalkd = beanstalkc.Connection(host="localhost", port="11300")
job = beanstalkd.reserve()
print job.body
....
job.delete()

Reference: https://github.com/earl/beanstalkc/blob/master/beanstalkc.py
tutorial: http://beanstalkc.readthedocs.org/en/latest/tutorial.html

beanstalkc好简单,只有Connection和Job两个类。

beanstalkd学习笔记相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  5. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  6. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  9. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. 电路设计中电阻电容电感的选择原则
  2. java导入lucene_如何导入lucene的.jar包 ?
  3. swift开发记录 - MARK,TODO,FIXME
  4. C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体
  5. 简单的企业微信开发 前后端
  6. 线程间通讯《代码》pthread_cond_t
  7. C语言 顺时针打印矩阵(二维数组)
  8. 状态码301和302的区别?
  9. 代码审查清单 Code Review
  10. 绿坝现漏洞政府天价难护航
  11. 测试工具-Jira和禅道数据库分析
  12. 人工智能论文-人工智能技术在新冠病毒肺炎疫情防控中的应用
  13. 电脑安装双系统教程,电脑安装两个系统
  14. BAPI_PO_CREATE1 创建采购订单
  15. Git远程库代码回退
  16. MacBook Air(2012)维修笔记
  17. 定西稳定高速的服务器,中国移动宽带甘肃定西的dns服务器地址
  18. 路的选择与人生的哲思──读《未选择的路》
  19. BlogBus发难:博客为什么不能随便搬家?
  20. 基于单片机的遥控晾衣架电路设计(#0209)

热门文章

  1. 将固态硬盘作为缓存的设置方法
  2. 计算机内存寿命,终于明白为什么SSD有寿命限制而内存没有?
  3. 类office2007工具栏
  4. SqlServer日期格式
  5. 我的微软漫漫信仰路【多图】
  6. 视频信号 | 双绞线视频传输器
  7. Android自定义圆角边框
  8. STM32F103读取富思i6(i-bus)协议,基于固件库开发的版本(V3.5)
  9. Kaggle(Gun Violence Data)—美国枪支暴力事件分析(1)
  10. android 蓝牙 bluetooth OPP文件传输