|
|
@@ -0,0 +1,61 @@
|
|
|
+---
|
|
|
+title: "Beanstalkd 任务队列"
|
|
|
+date: 2021-07-01T10:37:08+07:00
|
|
|
+draft: true
|
|
|
+---
|
|
|
+
|
|
|
+## beanstalkd 组件
|
|
|
+
|
|
|
+[beanstalkd](https://beanstalkd.github.io/) 是一个任务队列,用于解耦任务发布和任务执行。主要用于异步任务,能提高主线业务的响应速度。
|
|
|
+
|
|
|
+[beanstalkd](https://beanstalkd.github.io/) 由纯 C 写就,编译简单,有相对极其简洁的启动参数,客户端协议采用 ascii 格式,可用 telnet 调试。有几乎所有主流编程语言的客户端协议封装库。
|
|
|
+
|
|
|
+## beanstalk 内部
|
|
|
+
|
|
|
+可参阅[官方文档](https://github.com/beanstalkd/beanstalkd/tree/master/doc),包含中英文版本。
|
|
|
+
|
|
|
+### 任务的状态迁移
|
|
|
+
|
|
|
+ put with delay release with delay
|
|
|
+ ----------------> [DELAYED] <------------.
|
|
|
+ | |
|
|
|
+ kick | (time passes) |
|
|
|
+ | |
|
|
|
+ put v reserve | delete
|
|
|
+ -----------------> [READY] ---------> [RESERVED] --------> *poof*
|
|
|
+ ^ ^ | |
|
|
|
+ | \ release | |
|
|
|
+ | `-------------' |
|
|
|
+ | |
|
|
|
+ | kick |
|
|
|
+ | |
|
|
|
+ | bury |
|
|
|
+ [BURIED] <---------------'
|
|
|
+ |
|
|
|
+ | delete
|
|
|
+ `--------> *poof*
|
|
|
+
|
|
|
+1. put 的 job 进入 READY , put_with_delay 的 job 进入 DELAYED (生产者)
|
|
|
+2. reserve 只能处理 READY 中的 job,reserve 成功后,job 进入 RESERVED 状态。(消费者)
|
|
|
+3. 已经 reserve 某 job 的消费者可
|
|
|
+ - 执行 release 使 job 进入 READY
|
|
|
+ - 执行 release_with_delay 使 job 进入 DELAYED
|
|
|
+ - 执行 bury 使 job 进入 BURIED
|
|
|
+ - 执行 delete 删除 job
|
|
|
+ 如果在 job 配置的时间内未执行任何以上操作,beanstalkd 会使 job 从 RESERVED 进入 READY。可以在超时前执行
|
|
|
+ touch 来避免这种情况。
|
|
|
+4. 可以执行 kick 使 DELAYED 和 BURIED 的 job 进入 READY
|
|
|
+5. 可以执行 delete 删除 BURIED 和 RESERVED 的 job
|
|
|
+
|
|
|
+### 分布式
|
|
|
+
|
|
|
+从其官网上的代码可以看出 beanstalkd 是支持分布式的,如下:
|
|
|
+
|
|
|
+```c
|
|
|
+beanstalk = Beanstalk::Pool.new(['10.0.1.5:11300'])
|
|
|
+loop do
|
|
|
+ job = beanstalk.reserve
|
|
|
+ puts job.body # prints "hello"
|
|
|
+ job.delete
|
|
|
+end
|
|
|
+```
|