Проверка состояния фоновых процессов PHP beanstalkd

У меня есть веб-сайт, написанный на PHP (CakePHP), где определенные ресурсоемкие задачи обрабатываются фоновым процессом. Это делается через очередь сообщений Beanstalkd. Мне нужен какой-то способ получить статус этого фонового процесса, чтобы я мог отслеживать его с помощью Monit.

Фоновый процесс представляет собой оболочку CakePHP (просто скрипт PHP CLI), которая взаимодействует с Beanstalkd. Он просто выполняет резерв() на Benastalkd и ждет нового сообщения. Когда он получает сообщение, он обрабатывает его. Мне нужен способ мониторинга этого процесса с помощью Monit, чтобы он мог перезапустить фоновый процесс, если что-то пошло не так. .

До сих пор я думал о написании сценария PHP CLI, который отбрасывает сообщение в Beanstalkd. Фоновый процесс получает сообщение и каким-то образом сообщает о своем внутреннем статусе сценарию CLI. Но как? Розетки? Общая память? Какой-то другой метод IPC?

Или я, возможно, слишком усложняю и есть ли более простой способ контролировать такой процесс с помощью Monit?

Заранее спасибо!


person Sander Marechal    schedule 26.11.2009    source источник


Ответы (2)


Вот что я в итоге сделал.

CLI-скрипт подключается к beanstalkd, создает новую очередь (tube) и начинает ее просматривать. Затем он отбрасывает сообщение с наивысшим приоритетом в очередь, за которой наблюдает фоновый демон. Это сообщение содержит имя новой очереди, которую отслеживает сценарий CLI.

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

Когда сценарий CLI не получает ответа в течение 30 секунд, он завершается с ошибкой, указывающей, что фоновый демон (скорее всего) завис.

Я завязал все это в Monit. Теперь Monit может проверить, работает ли фоновый демон (с помощью pid-файла и списка процессов), и убедиться, что он на самом деле все еще обрабатывает сообщения (с помощью инструмента CLI, чтобы проверить, отвечает ли он на запросы о состоянии).

person Sander Marechal    schedule 30.11.2009

Вероятно, есть плагин для Monit или Nagios для подключения, запуска статистики и возврата, если их «слишком много». Для этого еще не написан «протокол», но не кажется слишком сложным изменить существующий текстовый протокол (например, nntp или smtp), чтобы он делал то, что вы хотите. Хотя, судя по всему, это означает писать его на C.

Из сценария CLI-PHP я бы использовал один (или оба) из двух разных методов.

1/ поместите сообщение (с низким) приоритетом в очередь и убедитесь, что оно вернется в течение нескольких секунд. Поместить его в выделенную очередь и убедиться, что там ничего нет, прежде чем положить его туда, также было бы хорошим дополнением. 2/проведите «статистику» и посмотрите, сколько ожидающих: «текущие задания готовы».

Чтобы вернуть информацию на веб-сайт (в любом случае), вы можете записать в файл или что-то вроде Memcached, который gts читает и обрабатывает.

person Alister Bulman    schedule 26.11.2009
comment
Не совсем то, что я ищу. Ваше предложение, кажется, тестирует beanstalkd, а не мой фоновый процесс, который использует сообщения beanstalkd. Итак, мне каким-то образом нужно сигнализировать моему фоновому процессу (либо через beanstalkd, либо с помощью сигналов POSIX. Я не знаю другого способа), а затем фоновый процесс должен сообщить о своем статусе обратно. Но как? - person Sander Marechal; 27.11.2009