【问题标题】:beanstalkd + pheanstalk rush conditionbeanstalkd + pheanstalk rush 条件
【发布时间】:2013-07-31 05:03:35
【问题描述】:

我有 beanstalkd 设置。我正在使用 pheanstalk php 库来添加工作和为我的工人。

添加作业工作正常,我正在数据库中记录作业 ID 以供以后参考。没有作业 ID 被跳过 IE:它们依次编号:1、2、3、4

现在工作的部分是工人。他们工作的事实是他们做应该做的事情,但我让其中三个在运行,出于某种原因,同一个工作会运行两到三遍,而不是只运行一次。

我不确定为什么会发生这种情况,我只是使用带有内存检查的 while 循环 + 我的工作代码来监控新工作。

这是该代码的开始。

    while (1) {
        $job = $this->pheanstalk->watch('my_tube')->ignore('default')->reserve();
        $job_decoded = json_decode($job->getData(), false);

这是 benstalk 控制台的输出。忽略第一行,因为这是我不使用的默认管。

在队列中再添加一项作业后,总列增加到 4 并且没有其他任何变化。

【问题讨论】:

    标签: php beanstalkd pheanstalk


    【解决方案1】:

    我发现问题是一个错误导致第一个工人做它应该做的事情,但在移除工作之前崩溃了。

    所以下一个工人会捡起它,它会无法跳转到我的 catch 块并绕过 php 错误,然后删除作业。

    【讨论】:

    • 这是您在使用队列和工作程序时必须解决的主要问题之一 - 如果它们失败,您必须抓住它,并做正确的事情 - 忽略错误并重试很少是正确的- 下次它也会失败,然后你就陷入了无限循环。详细日志记录有助于找出正在发生的事情。
    • 嘿嘿,很好,问答。我开始使用 pheanstalk,我自己也有一些疑问。我创建了一个问题,您能否给我您的见解? stackoverflow.com/questions/37370688/…
    猜你喜欢
    • 2016-09-21
    • 2021-01-22
    • 2013-03-06
    • 2013-04-19
    • 2017-07-14
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多