Поймать событие beanstalkd DEADLINE_SOON в php - PullRequest
2 голосов
/ 16 марта 2011

Я использую очередь сообщений Beanstalkd для обработки видео ffmpeg в моем проекте. Я использую PHP-клиент pheanstalk для очереди 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 () я использую что-то вроде:


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

Как вы знаете, обработка видео может занимать много времени, а иногда и превышает предварительно заданное задание ttr (время запуска). Таким образом, задание получает событие истечения времени ожидания и возвращается в очередь снова. Я запускаю своего работника одновременно несколько раз для асинхронной обработки. Поэтому следующий свободный работник пытается устроиться на незаконченную работу. Наконец, у меня есть два или более процессов в одном видеофайле. Я думаю, я могу определить очень длинный ttr , но это не очень хорошее решение. Я заметил, что у beanstalkd есть событие DEADLINE_SOON. Но я не знаю, как поймать это в моем работнике. Мне нужно чтобы у меня была возможность использовать команду "touch" .

У вас есть какие-нибудь советы?

1 Ответ

3 голосов
/ 13 апреля 2011

Согласно сообщению списка рассылки (часть этой цепочки ), сообщение 'DEADLINE_SOON' будет отправлено обратно, только если у вас есть резервный запрос, когда срок действия TTR истекает.

Если вы зарезервировали одну работу и обрабатываете ее (а не собираете несколько других работ), вы не увидите сообщение о крайнем сроке - вы его не ищете, и если бы вы это делали, то вы бы вероятно, не будет обрабатывать файл в первую очередь.

Думайте о настройке TTR как о втором шансе получить еще одну трещину на работе, если есть проблема с рабочим, и она не touch или delete работа, которую он поднял. Установите тайм-аут, по крайней мере, так долго, как вы ожидаете, что обработка займет, а затем добавьте еще как запас прочности. Лучше подождать какое-то сложное действие, чем постоянно повторять одно и то же. Если вы установили слишком низкое значение TTR, вы продолжите получать тот же файл, и у вас будет истек срок действия TTR.

...