【问题标题】:beanstalkd - what happens to reserved, but not completed jobs?beanstalkd - 保留但未完成的工作会发生什么?
【发布时间】:2011-12-24 09:53:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php service daemon beanstalkd


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      我在elsewhere 上发布了关于使用 Supervisord 和 shell 脚本运行工作程序的信息。它的优点是在大多数情况下,您可能不介意等待一段时间,因为工作会干净利落地完成。您可以让 supervisord 杀死运行工作脚本的 bash 脚本,当脚本本身完成时,只需退出,因为它无法重新启动。

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

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

      【讨论】:

      • 感谢阿利斯特的回答!我已经开始允许发送“退出”命令,以结束工作人员。可能也值得研究 supervisord,因为目前我的流程处理确实有点脆弱!
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 2015-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多