beanstalkd.md 2.4 KB


title: "Beanstalkd 任务队列" date: 2021-07-01T10:37:08+07:00

draft: false

beanstalkd 组件

beanstalkd 是一个任务队列,用于解耦任务发布和任务执行。主要用于异步任务,能提高主线业务的响应速度。

beanstalkd 由纯 C 写就,编译简单,有相对极其简洁的启动参数,客户端协议采用 ascii 格式,可用 telnet 调试。有几乎所有主流编程语言的客户端协议封装库。

beanstalk 内部

可参阅官方文档,包含中英文版本。

任务的状态迁移

 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 是支持分布式的,如下:

beanstalk = Beanstalk::Pool.new(['10.0.1.5:11300'])
loop do
  job = beanstalk.reserve
  puts job.body # prints "hello"
  job.delete
end