7

我创建了一个从beanstalkd读取并处理作业的 PHP 脚本。那里没有问题。

我要做的最后一件事就是为它编写一个初始化脚本,这样它就可以作为服务运行。

然而,这给我带来了另一个问题。尝试停止服务时,一种明显的方法是尝试终止该进程。但是,如果我这样做,如果 PHP 脚本处理到一半,工作会发生什么?所以任务被保留了,但脚本从来没有成功或失败(分别删除或埋葬),会发生什么?

我的猜测是 TTR 会过期,然后它会被放回就绪队列?

还有第二个问题,关于如何更好地管理停止 PHP 服务的任何提示?

4

3 回答 3

8

当工作进程(beanstalk 客户端)打开与 beanstalkd 的连接并保留作业时,该作业将处于“保留”状态,直到客户端发出删除/释放命令(或)作业超时。

如果工作进程突然终止,它与 beanstalkd 的连接将关闭,服务器将立即释放使用该特定连接保留的所有作业。

参考:http ://groups.google.com/group/beanstalk-talk/browse_thread/thread/232d0cac5bebe30f?hide_quotes=no#msg_efa0109e7af4672e

于 2011-11-24T18:02:10.467 回答
4

任何超时且未被掩埋或touched 的作业将返回到就绪队列以进行保留。

我已经在其他地方发布过关于使用 Supervisord 和 shell 脚本来运行 worker 的文章。它的优点是在大多数情况下,您可能不介意等待一段时间,因为工作会干净利落地完成。您可以让 supervisord 杀死运行工作脚本的 bash 脚本,并且当脚本本身完成时,只需退出,因为它无法重新启动。

另一种方法是将最高优先级 (0) 的消息放入工作人员监听的管道中,这将使工作人员首先删除消息,然后退出。我设置了 shell 脚本来检查特定的返回值(来自exit($val);),然后它们也将退出 shell 脚本中的任何循环。

我已经将这些技术用于 Beanstalkd 和 AWS:SQS 队列运行器有一段时间了,每天处理通过系统运行的数百万个作业。

于 2011-11-08T19:29:00.587 回答
0

如果您的工作太有价值而不能丢失,您还可以使用 pcntl 等到工作完成,然后重新启动/关闭您的工作人员。我已经设法处理所有合适的 pcntl 信号以将工作释放回管中。

于 2017-07-26T17:20:35.180 回答