beanstalkd常见问题解答

来源:互联网 发布:yum install Firefox 编辑:程序博客网 时间:2024/06/05 05:43

高层次角度,它是如何工作的?

对于你的分布式应用来说,Beanstalkd是一个大的待办事项列表。如果有一个你想推迟的工作(报道(say),发送一封email,推送一些数据到一个缓慢的外部服务,从一个外部服务拉取数据,生成高质量图片缩略图)你放置一个job到beanstalkd,job是关于那个工作的描述。一些进程(例如:web请求处理程序)称之为producer,放置job到队列。其它进程称之为worker,从队列取出job,然后运行它们。

请参见 About This Blog: Beanstalk Messaging Queue ,工作队列的总体介绍,特别是beanstalkd。

Job是持久化的? 停电时,将发生什么?

是的;如果你选择持久化,你可以使用"-b"选项,beanstalkd会把所有job写到binlog。如果停电,你可以使用同样的选项来重启beanstalkd,它将恢复日志内容。

beanstalk本身支持分布式服务? 

是的,虽然这是通过客户端来实现,就像memcached。beanstalkd服务实例之间互不知晓。

协议是否帮助实现阻塞,或这属于客户端库的实现范围? 换言之,客户端仍然必须做轮询?

beanstalk协议的reserve命令是阻塞的。客户端可以很简单的读取响应 — 这将阻塞直到一个job可用,并返回reserved给客户端。客户端不必轮询。

如果我想轮询,需要做什么?是否有带超时的reserve命令?

是的,从1.1版开始就有了。这个命令是“reserve-with-timeout”。所有细节在协议文档。

tube是什么?它们如何工作?

Tube是job队列。

Tube常见用例是有完全不同的一组生产者和消费者集合通过单一的beanstalk实例运行,一个消费者不知道一些生产者所生产的job要做什么。例如,生产者1可以把job放到队列的tube1中,消费者1从tube1获取job,这和tube2(生产者2和消费者2一起工作的tube)完全独立。

"buried"状态的目的是什么?我应该在什么时候使用它?

如果你隐藏(bury)一个job,服务器将不管它直到你踢(kick)这个job。当job是"buried"状态,它将不被预定(reserved),并且它将不能被放置到ready队列。

例如,当大规模的应用和难断定run-times时,在防止服务器把超时任务重新放入队列方面,这是非常有用的。如果一个客户端reserve一个job,然后先bury它,再处理业务逻辑,然后由于死锁卡住了,这个job将无限期的是buried状态,可供人工检查之用 — 它将不会被其它worker获取。

是否有web管理接口?

是的。 django-jack,很少,但对于小规模任务是够用的。

TTR是如何工作的?

TTR仅用于一个job变成reserved状态的时候。在那个时候,一个计时器(在job状态中称为“time-left”)开始从job的TTR开始倒计时。

  • 如果计时器变成0,这个job被放回ready队列。
  • 计时器到期之前,如果这个job变成"buried"、“deleted”或"released"状态,计时器将停止并退出。
  • 计时器变成0之前,如果这个工作变成"touched",计时器从TTR重新开始倒计时。

(非"reserved"状态的job仍然包含一个"time-left"条目,但它的值是无意义的。)

DEADLINE_SOON是什么意思?

DEADLINE_SOON是一个reserve命令的响应,它表明一个“reserved”状态的job的最后期限(deadline)马上要到期(目前的安全边际大约是1秒)。

如果你执行reserve命令时,频繁地收到DEADLINE_SOON错误,你可能应该考虑对你的job增加TTR,因为它表示你没有安时完成你的job。这也可能是在完成了你的job,却没有删除它们。

更多信息参见邮件讨论列表

 

英文:https://github.com/kr/beanstalkd/wiki/FAQ

0 0
原创粉丝点击