【发布时间】:2014-11-10 01:06:30
【问题描述】:
我有一个使用 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;
}
}
有趣的部分是大多数(重复的)队列工作人员在删除作业时会失败,并且错误日志中还剩下这个:
exception 'Pheanstalk_Exception_ServerException' with message 'Job 3248 NOT_FOUND: does not exist or is not reserved by client'
ttr(运行时间)设置为 172,800 秒(或 48 小时),远大于完成作业所需的时间。
【问题讨论】:
标签: php laravel beanstalkd