Tim*_*eld 9 php beanstalkd laravel
我有一个用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;
}
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,大多数(重复的)队列工作程序在删除错误日志中留下的作业时失败:
exception 'Pheanstalk_Exception_ServerException' with message 'Job 3248 NOT_FOUND: does not exist or is not reserved by client'
Run Code Online (Sandbox Code Playgroud)
ttr(运行时间)设置为172,800秒(或48小时),这比作业完成所需的时间大得多.
排队时作业 time_to_run 是多少?如果运行作业花费的时间超过 time_to_run 秒,则该作业会自动重新排队并有资格由下一个工作线程运行。
保留的作业需要在 time_to_run 秒内被删除、释放或触及。调用touch()会重新启动超时计时器,因此工作人员可以使用它来给自己更多的时间来完成。或者在排队时使用足够大的值。
我发现 beanstalkd 协议文档很有帮助 https://github.com/kr/beanstalkd/blob/master/doc/protocol.md
| 归档时间: |
|
| 查看次数: |
4091 次 |
| 最近记录: |