Beanstalkd -保留但未完成的工作发生了什么



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

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

然而,这又给我提出了另一个问题。当尝试停止服务时,一个明显的方法是尝试杀死该进程。但是,如果我这样做,如果PHP脚本在处理它的过程中进行了一半,那么作业将会发生什么?所以这个任务被保留了,但是脚本从来没有成功或失败过(分别删除或掩埋),会发生什么?

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

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

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

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

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

任何时间用完的作业,并且没有被掩埋或touch ed返回到准备队列中被保留。

我已经在其他地方发布了关于使用superord和shell脚本来运行工人。它的好处是,大多数时候,你可能不介意等一会儿,因为工作完成得很干净。您可以让superord杀死运行工作脚本的bash脚本,并且当脚本本身完成时,简单地退出,因为它无法重新启动。

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

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

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

相关内容

  • 没有找到相关文章

最新更新