--- title: "Beanstalkd 任务队列" date: 2021-07-01T10:37:08+07:00 draft: false --- ## beanstalkd 组件 [beanstalkd](https://beanstalkd.github.io/) 是一个任务队列,用于解耦任务发布和任务执行。主要用于异步任务,能提高主线业务的响应速度。 [beanstalkd](https://beanstalkd.github.io/) 由纯 C 写就,编译简单,有相对极其简洁的启动参数,客户端协议采用 ascii 格式,可用 telnet 调试。有几乎所有主流编程语言的客户端协议封装库。 ## beanstalk 内部 可参阅[官方文档](https://github.com/beanstalkd/beanstalkd/tree/master/doc),包含中英文版本。 ### 任务的状态迁移 ```html 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 ```