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