gpt4 book ai didi

php - 多个队列监听器将在多个进程上运行相同的作业

转载 作者:可可西里 更新时间:2023-11-01 12:19:15 24 4
gpt4 key购买 nike

我有一个使用 Laravel 4.2 框架编写的简单 Web 应用程序。我已配置 Laravel 队列组件以将新队列项添加到本地运行的 beastalkd 服务器。

本质上,有一个 POST 路由将一个项目添加到 beanstalkd 管。

然后我将 supervisord 设置为将 artisan queue:listen 作为三个独立的进程运行。我看到的问题是,不同的 queue:listen 进程最终会为一个插入的作业生成一到三个 queue:worker 进程。

最终结果是,插入队列的一项作业有时会同时由多个工作人员处理,这显然是我试图避免的。

作业代码比较简单:

<?php

use App\Repositories\URLRepository;

class ProcessDataJob {
private $urls;

public function __construct(URLRepository $urls)
{
$this->urls = $urls;
}

public function fire($job, $data)
{
$input = $data['post'];

if (!isset($data['post']) && !is_array($data['post'])) {
Log::error('[Job #'.$job->getJobId().'] $input was empty inside CreateAuditJob. Deleting job. Quitting. Bye!');
$job->delete();
return false;
}

//
// ... code that will take a few hours to run.
//

$job->delete();
Log::info('[Job #'.$job->getJobId().'] ProcessDataJob was successful, deleting the job!');
return true;
}
}

有趣的是,大多数(重复的)队列 worker 在删除作业时失败,错误日志中留下了这个:

exception 'Pheanstalk_Exception_ServerException' with message 'Job 3248 NOT_FOUND: does not exist or is not reserved by client'

ttr(运行时间)设置为 172,800 秒(或 48 小时),这比完成作业所需的时间要长得多。

最佳答案

排队时作业的运行时间是多少?如果运行该作业的时间超过 time_to_run 秒,则该作业会自动重新排队并有资格由下一个工作人员运行。

保留的作业有 time_to_run 秒被删除、释放或触摸。调用 touch() 会重新启动超时计时器,因此工作人员可以使用它来给自己更多的时间来完成。或者排队时使用足够大的值。

我发现 beanstalkd 协议(protocol)文档很有帮助 https://github.com/kr/beanstalkd/blob/master/doc/protocol.md

关于php - 多个队列监听器将在多个进程上运行相同的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com