Очередь заданий на PHP/MySQL. Пишу очередной костыль?

В PHP я разбираюсь очень посредственно, но когда-то написал востребованную узким кругом людей систему сбора статистики. Сейчас скрипт, который собирает данные, выполняется от 45 минут и до более часа, и вот — настало время масштабирования во времени.


Хочу написать очередь заданий на PHP, но не заморачиваться с RabbitMQ и прочими MQ, а хранить список заданий в MySQL. В гугле очень мало информации, в основном предлагают готовые решения. Но я ведь хочу сам разобраться, что к чему.


Что я хочу сделать:

Несколько раз в сутки запускается скрипт, который наполняет очередь заданий (урлы).

Раз в 1-3 секунды запускается воркер, который выбирает себе задание (урл) и начинает его обрабатывать (скачивать и класть в БД). Если заданий нет, то отмирает, если есть, то выполняет.


Вопросы:

Как запускать воркер, что делать, чтобы воркеры не превращались в зомбей, и не плодились излишне?

Как правильно и грамотно такое делают?
  • Вопрос задан
  • 6220 просмотров
Решения вопроса 1
@egorinsk
Самый простой способ — по крону запускаете «надсмотрщика» (supervisor). Надсмотрщик сохраняет свой PID в файл, мемкеш или БД и если видит, что другой надсмотрщик уже запущен — молча умирает.

Надсмотрщик должен быть предельно прост, чтобы не падать. Обнаружить падение надсмотрщика можно по тому признаку, что файл с PID есть, а процесса с таким PID нет — значит предыдущий надсмотрщик внезапно завершился. Это можно зафиксировать в лог.

Если надсмотрщик запустился и других надсмотрщиков нет, он берет задания и запускает одного или несколько скриптов-рабочих (worker), каждому раздает по заданию. Если кто-то из рабов успешно завершился, помечаем задачу как выполненную, если умер — он логгирует это и запускает нового, если с N попыток задача так и не сделана, она помечается как невыполнимая и больше не выполняется.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Vampiro
Погуглите phpdeamon. Думаю, однопоточного демона тут вполне достаточно. Есть задача — работаем. Нету — слип на 10/60/600 сек. Запуск демона можно будет прикрутить на крон.

Грамотно — не использовать паттерн «костыль», а пользовать готовое решение, разбираясь в нем по ходу дела :)
Ответ написан
zarincheg
@zarincheg
Используйте Gearman. Он предельно прост в использовании и удобен. Ставите расширение для PHP, пишете воркеры ваши и все. Может хранить очереди в MySQL.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы