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

StackOverflow https://stackoverflow.com/questions/1803015

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top