Нам часто приходится работать с системами очередей на php.
Для разработки скрипта, который будет слушать определённую очередь (консюмера), мы просто создаём скрипт, который в бесконечном цикле слушает эту очередь.
Сам скрипт демонизируется - запускается через supervisor, или systemd.
Если по какой-то причине скрипт упал - система перезапускает.
Вопросы:
1. Часто слышу от других разработчиков или статьях, что php не предназначен для долгой жизни.
Они критикуют такие решения как у нас, т.к. они не надёжные.
Как тогда они решают подобные задачи?
И как вообще принято решать такие задачи ?
Может статьи посоветуете почитать или кейсы какие-то?
2. Я понимаю, что могут быть случаи, когда скрипт повиснет, и в итоге, сам консюмер не работает, но и не падает, чтобы система перезапустила. Какие решения в этих случаях? Из-за чего может повернуть скрипт?
Я думал бывает два состояния: работает и нет (завершен успешно или с ошибкой).
И как решают это другие?
У меня такое решение в голову приходит:
Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.
И по крону, другой скрипт проверяет записи в таблице, если какой-то консюмер долго не обновлял запись - убить процесс по pid.
Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.
Кажется, вы близки к тому, чтобы изобрести gearman.
Если делать самоделку, то обычно воркер беря задачу отмечает в таблице время старта и свой pid, и время завершения. И какой-то watcher проверяет таски которые слишком долго в работе и перезапускает.
У меня такое решение в голову приходит:
Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.
И по крону, другой скрипт проверяет записи в таблице, если какой-то консюмер долго не обновлял запись - убить процесс по pid.
В принципе, вам уже ответили. Хочу только добавить немного.
Обратите внимание на systemd. В нём есть механизм проверки признаков жизни watchdog. Можно пингать самого себя тестовым сообщением, например. И рестартить по отказу.
[Service]
...
WatchdogSec=30s
Restart=on-failure
И конечно же прикрутить мониторинг, чтобы смотреть через Grafana или т.п.
Спасибо!
но не понимаю, как это будет работать ?
Откуда systemd поймет, скрипт завит в бесконечном цикле и слушает какой-то порт через сокеты (и все нормально работает), или просто из-за какого-то сбоя повис и не может завершиться с ошибкой?