1

所以我使用 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 让工作恢复的方式有些奇怪?

4

2 回答 2

0

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

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

于 2017-04-27T17:48:30.233 回答
0

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

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

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

于 2017-07-11T18:30:13.460 回答