Laravel 5 Laravel 5:多个工作人员-无法删除作业XXXXXX:未找到

Laravel 5 Laravel 5:多个工作人员-无法删除作业XXXXXX:未找到,laravel-5,task-queue,Laravel 5,Task Queue,我正在使用Laravel 5创建一个网站。我用的是带2根管子的豆茎的队列。我有10名工人受daemontools监控。5名工人处理管道A和B。其他5名工人仅处理管道B 大多数情况下,事情都很顺利,但偶尔B管似乎会锁定。日志显示工人正在抛出异常 [2015-04-24 07:09:36] local.ERROR: exception 'Pheanstalk\Exception\ServerException' with message 'Cannot delete job 273812: NOT_

我正在使用Laravel 5创建一个网站。我用的是带2根管子的豆茎的队列。我有10名工人受daemontools监控。5名工人处理管道A和B。其他5名工人仅处理管道B

大多数情况下,事情都很顺利,但偶尔B管似乎会锁定。日志显示工人正在抛出异常

[2015-04-24 07:09:36] local.ERROR: exception 'Pheanstalk\Exception\ServerException' with message 'Cannot delete job 273812: NOT_FOUND' in /x/website/vendor/pda/pheanstalk/src/Command/DeleteCommand.php:44
Stack trace:
#0 /x/website/vendor/pda/pheanstalk/src/Connection.php(121): Pheanstalk\Command\DeleteCommand->parseResponse('NOT_FOUND', NULL)
#1 /x/website/vendor/pda/pheanstalk/src/Pheanstalk.php(384): Pheanstalk\Connection->dispatchCommand(Object(Pheanstalk\Command\DeleteCommand))
#2 /x/website/vendor/pda/pheanstalk/src/Pheanstalk.php(67): Pheanstalk\Pheanstalk->_dispatch(Object(Pheanstalk\Command\DeleteCommand))
#3 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php(73): Pheanstalk\Pheanstalk->delete(Object(Pheanstalk\Job))
#4 /x/website/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(46): Illuminate\Queue\Jobs\BeanstalkdJob->delete()
#5 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(126): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\BeanstalkdJob), Array)
#6 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php(51): Illuminate\Queue\Jobs\Job->resolveAndFire(Array)
#7 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(207): Illuminate\Queue\Jobs\BeanstalkdJob->fire()
#8 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(159): Illuminate\Queue\Worker->process('beanstalkd', Object(Illuminate\Queue\Jobs\BeanstalkdJob), '20', '120')
#9 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(113): Illuminate\Queue\Worker->pop(NULL, NULL, '120', 3, '20')
#10 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(85): Illuminate\Queue\Worker->runNextJobForDaemon(NULL, NULL, '120', 3, '20')
#11 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(101): Illuminate\Queue\Worker->daemon(NULL, NULL, '120', 128, 3, '20')
#12 /x/website/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(67): Illuminate\Queue\Console\WorkCommand->runWorker(NULL, NULL, '120', 128, true)
#13 [internal function]: Illuminate\Queue\Console\WorkCommand->fire()
#14 /x/website/vendor/laravel/framework/src/Illuminate/Container/Container.php(523): call_user_func_array(Array, Array)
#15 /x/website/vendor/laravel/framework/src/Illuminate/Console/Command.php(115): Illuminate\Container\Container->call(Array)
#16 /x/website/vendor/symfony/console/Symfony/Component/Console/Command/Command.php(257): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#17 /x/website/vendor/laravel/framework/src/Illuminate/Console/Command.php(101): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 /x/website/vendor/symfony/console/Symfony/Component/Console/Application.php(874): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#19 /x/website/vendor/symfony/console/Symfony/Component/Console/Application.php(195): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#20 /x/website/vendor/symfony/console/Symfony/Component/Console/Application.php(126): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#21 /x/website/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(94): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#22 /x/website/artisan(36): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#23 {main}
我想知道这个问题是否是由几个工人从事同一工作引起的。这是可能的还是有某种互斥来控制


还有什么可能导致这种情况?

也有同样的问题。我的工作花了60多秒才完成。在默认管道上增加配置队列中的ttr值就成功了。
希望这会有所帮助。

排队命令花费的时间太长,问题是由beanstalkd中试管上的TTR值引起的,但无需更改该值

简而言之,beanstalkd将只保留作业最长一段时间(直到TTR),然后它将假设出现了问题,并将作业返回到就绪状态

相反,可以定期触摸作业以重置预约计时器

在Laravel中,我将它添加到我的App\Commands\Command类中,并定期在长时间运行的作业的循环内部调用它

public function touch()
{
    if (method_exists($this->job, 'getPheanstalk')) {
        $this->job->getPheanstalk()->touch($this->job->getPheanstalkJob());
    }
}

为了更精确地触摸,您可以使用上面提供的工作功能,并在工作中执行以下操作:

1) 在构造函数中声明属性并设置其值:

Protected $ttr;

public function __construct() {
    $this->ttr = time();
}
2) 然后测量循环内的时间差。在我的例子中,我下载并裁剪了数千张图像,因此在该循环中,我插入了以下内容:

//With a ttr of 60.
if((time() - 50) >= $this->ttr) { //If over 50 seconds since ttr start,
    $this->touch(); //reset ttr, 
    $this->ttr = time(); //and set new time.
}

谢谢我还成功地将其与耗时太长的工作隔离开来。优化我的代码和按照您的建议更改ttr的组合可能会解决这个问题。我将在这里更新我的发现。如果你的任务是幂等的,那么这就可以了,否则想想如果一个任务突然花了很长时间会发生什么?保持接触工作的方法要安全得多。这还允许您仅将其应用于所需的作业,而不是整个队列。有些项目可能永远不需要花费很长的时间,事实上可能希望很快被发现。我可以得到一些关于我如何具体实现这一点的澄清吗?如果您说需要将其添加到App\Command,那么您是说我创建了一个名为TouchCommand.php的新命令,例如,使用它,因为在命令中,我通常看到的是构造函数和句柄,所以不确定它会去哪里。那么在我的实际工作中,我该怎么称呼它呢?你可以直接把这个函数放到Command类中。您的其他命令类将从中扩展并继承该函数。然后在他们的handle()方法中,你可以周期性地调用$this->touch()来重置计时器。作为参考,我在抽象作业类中使用了这段代码,然后在长时间运行的作业中调用了该方法。我不明白。。我使用的是Laravel5.2,因此我在Job.php类中添加了touch命令。在我的工作执行期间,我经常调用它,并且我已经确认调用正在进行,并且在if语句中已经到达。它也没有抛出任何错误。但根据queue.php配置文件中的TTR,我的作业仍在超时。我做错什么了吗?你能发布一个更完整的代码示例吗?谢谢