我创建了一个从beanstalkd读取并处理作业的PHP脚本。没问题。
我要做的最后一件事就是为它编写一个init脚本,这样它就可以作为服务运行。
然而,这已经为我提出了另一个问题。当试图停止服务时,一种显而易见的方法是尝试杀死该进程。但是,如果我这样做,那么如果PHP脚本在处理它的过程中会发生什么呢?所以工作是保留的,但是脚本从未成功或失败(分别删除或埋葬),会发生什么?
我的猜测是TTR会过期,然后它会被放回就绪队列吗?
还有第二个问题,关于如何更好地管理停止PHP服务的任何提示?
答案 0 :(得分:5)
当一个工作进程(beanstalk客户端)打开与beanstalkd的连接并保留一份工作时,该工作将被保留"保留"状态,直到客户端发出删除/释放命令(或)作业超时。
如果工作进程突然终止,它与beanstalkd的连接将关闭,服务器将立即释放使用该特定连接保留的所有作业。
答案 1 :(得分:3)
任何耗尽时间且未被掩埋或touch
编辑的作业都会返回到准备好的队列中进行保留。
我发布了elsewhere关于使用Supervisord和shell脚本来运行工作程序的信息。它的优势在于,大部分时间,你可能不介意等待一段时间干净地完成工作。你可以让supervisord杀死运行工作脚本的bash脚本,当脚本本身完成时,只需退出,因为它无法重新启动。
另一种方法是将最高优先级(0)消息放入工作人员监听的管中,这将使工作人员首先删除该消息,然后退出。我设置shell脚本来检查特定的返回值(来自exit($val);
),然后它们也会退出shell脚本中的任何循环。
我已经将这些技术用于Beanstalkd以及AWS:SQS队列运行器一段时间,每天处理数百万个通过系统运行的作业。
答案 2 :(得分:0)
如果你的工作太宝贵而不能丢失,你也可以使用pcntl等到工作完成然后重新启动/关闭你的工作人员。我已设法处理所有合适的pcntl信号,以将作业释放回管。