【问题标题】:Laravel 5: Multiple workers - Cannot delete job XXXXXX: NOT_FOUNDLaravel 5:多个工人 - 无法删除工作 XXXXXX:NOT_FOUND
【发布时间】:2015-04-24 07:50:00
【问题描述】:

我正在使用 Laravel 5 创建一个网站。我正在使用带有 2 个管子的 beanstalkd 队列。我有 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}

我想知道这个问题是否可能是由几名工人从事同一份工作造成的。这是可能的还是有某种互斥锁来控制它?

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

【问题讨论】:

    标签: laravel-5 task-queue


    【解决方案1】:

    队列命令耗时过长,问题是由 beanstalkd 中管子上的 TTR 值引起的,但没有必要更改该值。

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

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

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

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

    【讨论】:

    • 我可以澄清一下我是如何实现这个的吗?如果您说需要将其添加到 App\Command 中,那么您是说我创建了一个名为 TouchCommand.php 的新命令,例如,因为在命令中我通常看到的是构造函数和句柄,所以不确定它的去向。那么在我的实际工作中我该怎么称呼它呢?
    • 您可以直接将该函数放入 Command 类中。您的其他命令类将从它扩展并继承该功能。然后在他们的 handle() 方法中,您可以定期调用 $this->touch() 来重置计时器。
    • 作为参考,我在我的抽象 Job 类上使用了这段代码,然后从我的长期运行的作业中调用了该方法。
    • 我不明白.. 我使用的是 Laravel 5.2,所以我将 touch 命令添加到我的 Job.php 类中。在我的工作执行期间,我经常调用它,并且我已经确认正在调用它并且它正在到达 if 语句中。它也没有抛出任何错误。但是根据我在 queue.php 配置文件中的 TTR,我的工作仍然超时。我做错什么了吗?
    • 您能否发布一个更完整的代码示例?谢谢!
    【解决方案2】:

    遇到了同样的问题。我的工作花了 60 多秒才完成。在默认管上增加配置队列中的 ttr 值就可以了。 希望对您有所帮助。

    【讨论】:

    • 谢谢。我还设法将其隔离到需要很长时间才能完成的工作。按照您的建议优化我的代码和更改 ttr 的组合可能会解决它。我会在这里更新我的发现。
    • 如果你的任务是幂等的,那么这样就可以了,否则想想如果一个任务突然需要更长的时间会发生什么?保持接触工作的方法要安全得多。这也允许您仅将其应用于您想要的作业,而不是整个队列。有些物品可能永远不需要花很长时间,实际上可能希望很快被抓住。
    【解决方案3】:

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

    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.
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2015-07-28
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多