2

我在我的项目中使用 Beanstalkd 消息队列来处理 ffmpeg 视频。我将pheanstalk PHP 客户端用于 beanstalkd 队列。我的工人看起来像:



...
// get latest job
$job = $this->pheanstalk->reserve();
// get the data from the job
$jobData = unserialize($job->getData());
// process job, giving a result
$result = $this->task($jobData);
if ($result) {
  // success = delete
  $this->pheanstalk->delete($job);
} else {
// failed = bury
  $this->pheanstalk->bury($job, 1024);
}
...

在 task() 方法中,我使用 smth,例如:


// video processing
$processVideo = 'ffmpeg -vpre libx264-max -y -i inputfile ...';
shell_exec($processVideo);
// taking screenshots from video
...

如您所知,视频处理可能需要很长时间,有时它会超过预定义的作业ttr(运行时间)。这样,作业就会收到超时事件并再次返回排队。我同时运行我的工人数次以进行异步处理。因此,下一个空闲的工人试图接受未完成的工作。最后,我在一个视频文件下有两个或多个进程。我想,我可以定义很长的ttr,但这不是一个好的设计。我注意到,beantalkd 有 DEADLINE_SOON 事件。但我不知道,如何在我的工人身上捕捉到它。我需要它能够使用“触摸”命令

你有什么建议吗?

4

1 回答 1

3

根据邮件列表消息此线程的一部分),DEADLINE_SOON只有在您提出保留请求时,当工作即将使其 TTR 过期时,才会发回“ ”消息。

如果您保留一项工作,并且正在处理它(而不是收集许多其他工作),您将不会看到截止日期消息 - 您不是在寻找它,如果您是,那么您可能不会首先处理文件。

touch如果工人有问题但它没有或delete它已经接手的工作,则将 TTR 设置视为第二次获得工作机会的机会。设置超时时间至少与您预期的处理时间一样长,然后添加更多作为安全余量。最好为一个复杂的动作等待一段时间,而不是一遍又一遍地在同一个动作上失败。如果您将 TTR 设置得太低,您将继续获得相同的文件,并且您将继续让 TTR 过期。

于 2011-04-12T23:23:06.877 回答