Как контролировать жизнь php-консюмеров?

Нам часто приходится работать с системами очередей на php.
Для разработки скрипта, который будет слушать определённую очередь (консюмера), мы просто создаём скрипт, который в бесконечном цикле слушает эту очередь.

Сам скрипт демонизируется - запускается через supervisor, или systemd.
Если по какой-то причине скрипт упал - система перезапускает.

Вопросы:
1. Часто слышу от других разработчиков или статьях, что php не предназначен для долгой жизни.
Они критикуют такие решения как у нас, т.к. они не надёжные.

Как тогда они решают подобные задачи?
И как вообще принято решать такие задачи ?

Может статьи посоветуете почитать или кейсы какие-то?

2. Я понимаю, что могут быть случаи, когда скрипт повиснет, и в итоге, сам консюмер не работает, но и не падает, чтобы система перезапустила. Какие решения в этих случаях? Из-за чего может повернуть скрипт?
Я думал бывает два состояния: работает и нет (завершен успешно или с ошибкой).

И как решают это другие?

У меня такое решение в голову приходит:
Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.
И по крону, другой скрипт проверяет записи в таблице, если какой-то консюмер долго не обновлял запись - убить процесс по pid.
  • Вопрос задан
  • 240 просмотров
Пригласить эксперта
Ответы на вопрос 3
Stalker_RED
@Stalker_RED
Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.

Кажется, вы близки к тому, чтобы изобрести gearman.

Если делать самоделку, то обычно воркер беря задачу отмечает в таблице время старта и свой pid, и время завершения. И какой-то watcher проверяет таски которые слишком долго в работе и перезапускает.
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
И как решают это другие?

У меня такое решение в голову приходит:
Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.
И по крону, другой скрипт проверяет записи в таблице, если какой-то консюмер долго не обновлял запись - убить процесс по pid.


В принципе, вам уже ответили. Хочу только добавить немного.
Обратите внимание на systemd. В нём есть механизм проверки признаков жизни watchdog. Можно пингать самого себя тестовым сообщением, например. И рестартить по отказу.
[Service]
...
WatchdogSec=30s
Restart=on-failure

И конечно же прикрутить мониторинг, чтобы смотреть через Grafana или т.п.
Ответ написан
New_Horizons
@New_Horizons
Бред:
И как решают это другие?

Если я правильно понял, то Laravel Queues
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы