【问题标题】:What happens with the QueueWorker when TTR ran out?当 TTR 用完时,QueueWorker 会发生什么?
【发布时间】:2017-05-06 19:37:15
【问题描述】:

这与 laravel 5.3、beantalk、ttr 和 timeout 与 Queue's 和 QueueWorkers 一起使用有关。 TTR:https://github.com/kr/beanstalkd/wiki/faq

如果我理解正确,队列中的作业会在 QueueWorker 挑选它时获得保留状态。当 ttr 用完时,此作业状态将更改回就绪。但是 QueueWorker 会发生什么?

假设 QueueWorker 通过以下命令将超时设置为 600:

php artisan queue:work --tries=1 --timeout=600 --sleep=0

ttr 默认设置为 60 秒。

在工作期间,向另一个站点发出请求,需要 120 秒才能得到响应。 60 秒后,由于 TTR 将作业设置回就绪状态。 QueueWorker 是否会继续工作直到收到响应,最多 600 秒?或者当达到 TTR 时,QueueWorker 会停止工作吗?

【问题讨论】:

    标签: laravel laravel-5 queue laravel-5.3 beanstalkd


    【解决方案1】:

    实际上,QueueWorker 会一直运行到作业完成。当你在没有 daemon 标志的情况下运行 queue worker 时,它将运行下面的代码:

    return $this->worker->pop(
        $connection, $queue, $delay,
        $this->option('sleep'), $this->option('tries')
    );
    

    参考: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Console/WorkCommand.php#L123

    这段代码所做的是将其作业从队列中弹出并作为命令触发该作业:

    public function process($connection, Job $job, $maxTries = 0, $delay = 0)
    {
        if ($maxTries > 0 && $job->attempts() > $maxTries) {
            return $this->logFailedJob($connection, $job);
        }
    
        try {
            $job->fire();
    
            $this->raiseAfterJobEvent($connection, $job);
    
            return ['job' => $job, 'failed' => false];
        } catch (Exception $e) {
            if (! $job->isDeleted()) {
                $job->release($delay);
            }
    
            throw $e;
        } catch (Throwable $e) {
            if (! $job->isDeleted()) {
                $job->release($delay);
            }
    
            throw $e;
        }
    }
    

    参考: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Worker.php#L213

    挖掘源代码以获取更多信息: https://github.com/laravel/framework/tree/5.2/src/Illuminate/Queue

    【讨论】:

    • 这是否意味着 QueueWorker 将继续工作直到超时,即使 ttr 用完?
    • 正确。有关 TTR 工作原理的更多详细信息github.com/kr/beanstalkd/wiki/faq#how-does-ttr-work
    • 将超时设置为高于 60 秒有什么意义?现在,第二个 QueueWorker 将选择该作业,因为在 TTR 用完之后,该作业将处于就绪状态,这会导致问题,因为第一个 QueueWorker 在尝试删除它时无法再找到该作业。当您使用高于 TTR 的超时时,必须偶尔使用“触摸”作业,以防止 TTR 超时,直到达到超时。我说的对吗?
    猜你喜欢
    • 2020-10-28
    • 2010-10-14
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多