我在我的项目中使用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 ,但这不是一个好的设计。我注意到,beanstalkd有DEADLINE_SOON事件。但我不知道,如何在我的工人身上抓住它。我需要它才能使用"touch" command。
你有什么建议吗?
答案 0 :(得分:3)
根据mailing list message(this thread的一部分),“DEADLINE_SOON
”消息只会在您有保留请求时发回,当作业即将发布时让TTR到期。
如果你保留一份工作并正在处理它(而不是收集其他一些工作),你就不会看到截止日期的消息 - 你不是在寻找它,如果你是,那么你会可能不是首先处理文件。
如果工作人员出现问题并且touch
或delete
已完成工作,则将TTR设置视为在工作中获得另一次破解的第二次机会。设置超时至少与预期处理时间一样长,然后添加更多作为安全边际。最好等待一段时间进行复杂的操作,而不是继续对同一个操作失败。如果您将TTR设置得太低,您将继续获得相同的文件,并且您将继续让TTR过期。