【问题标题】:Pheanstalk workers reserving same job multiple times when buried immediately立即埋葬时多次保留相同工作的Pheanstalk工人
【发布时间】:2017-09-25 15:11:42
【问题描述】:

所以我使用 beanstalk_console (https://github.com/ptrofimov/beanstalk_console) 来监控我的 beanstalkd 队列,有时我会得到 1 或 2 个工作卡在掩埋状态。这是由于我如何设置我的工人代码,我在保留一份工作后立即将其埋葬,如果一切顺利则将其删除(否则它会一直埋没)。我还使用 supervisord 来管理多个队列工作人员。下面的快速代码示例:

$pheanstalk = new Pheanstalk();
$pheanstalk->watch('tube');
while ($job = $pheanstalk->reserve()) {
    $pheanstalk->bury($job);
    $success = false;

    // Process job here. Set $success to true if no errors were encountered

    if ($success) {
        $pheanstalk->delete($job);
    }
}

现在我的问题是:我注意到,如果我使用 beanstalk_console 将我埋藏的工作移回他们指定的管道,那么我所有可用的工作人员都会在同一时间保留相同的工作(有趣的是,所有工作都使用不同的工作 ID),导致重复工作。他们也会同时被埋葬,尽管 beanstalk_console 只会显示最新的埋葬工作,所以我不确定发生了什么。如果我在埋葬工作之前添加 sleep(1) 之类的内容,那么只有 1 名工人保留这份工作,我不会得到重复的工作。这几乎就像在预订后立即埋葬一份工作,将其放回队列中。我的代码有问题吗?或者 beantalk_console 让工作恢复的方式有些奇怪?

【问题讨论】:

    标签: php beanstalkd pheanstalk


    【解决方案1】:

    当以前的类似问题似乎发生时,通常是因为工作脚本和 beanstalkd 之间的连接断开,因此作业回到队列中以在其他地方提取。

    还要确保捕获所有相关异常并检查返回,以便了解发生了什么。

    【讨论】:

    • 我实际上试图删除我的 while 语句中的所有代码行,只是将埋线保留在那里,它仍然使我的所有工作进程同时保留相同的工作,但工作 ID 不同.
    【解决方案2】:

    所以我重新审视了这个问题,看看为什么现在会出现。 Beanstalk 控制台使用 do while 循环来搜索剩余的作业,并且只有在因找不到更多隐藏的作业而引发异常时才会退出此循环。

    https://github.com/ptrofimov/beanstalk_console/blob/1.7.7/lib/include.php#L765

    不幸的是,看起来循环可以在抛出异常之前捕获我立即隐藏的作业(就像在我的示例代码中一样),这可能导致同一个作业被多次处理。我是否有 1 个或多个工人在等待工作也没关系。更多的工人只是意味着更多的重复处理。

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 2014-12-28
      • 2015-05-08
      • 2013-03-06
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      相关资源
      最近更新 更多