Как сделать циклическое выполнение кода в laravel?
Есть неограниченное страниц вк. Нужно постоянно контролировать на них изменения, как только на любой появляется обновление, мне нужно заносить эти обновления к себе в БД.
Думаю сделать это черед очереди Laravel-a(запустить 10 воркеров одновременно). Сделать Job, который будет проверять информацию о переданной странице ВК. При окончании работы Job-a он добавит в конец очереди свою копию, чтобы снова проверить информацию о странице. Только проблема в том, что если этот Job выполнится с ошибкой(я знаю про автоматический перезапуск неудавшихся Job-ов, но вдруг все попытки перезапуска провалятся) , он уже не перезапустит сам себя. Как решить эту проблему?
Konata Izumi, да, если убрать количество попыток это решит проблему. Тогда еще вопрос, как сделать чтобы при провале job-a он добавлялся в конец очереди а не в то же место?
Почитал доку, не нашел ничего про это. Ларавельские очереди ограничены по функционалу.
Как вариант можно попробовать в обработчике задачи при неудачном выполнении сменить очередь.
Запускать воркер на несколько очередей с приоритетом: high, low.
Задача не удалась в high, кидаем её в low. В low бесконечно пытаемся выполнить задачи.
В нормальных очередях если job не был выполнен то он сам вернется в очередь, даже можно настраивать когда. Что в Laravel там из коробки я не знаю, но логика, в целом, хорошая. Хотя я бы вынес наполнение очереди в отдельный механизм по тому как страниц может стать как больше так и меньше со временем, а такой алгоритм уходит в фиксированный цикл
Да, насчет зацикленности вы правы.
Думаю насчет этого механизма. Обязательно нужна возможность многопоточности.
Тогда может быть сделать Job, который будет брать все аккаунты по очереди и проверять их. По окончанию проверки добавит сам себя в очередь снова. А чтобы при запуске нескольких слушаетелей очереди одновременно Job-ы не проверяли одни и те же аккаунты, передавать в каждый Job число, которое означает какие аккаунты Job-у проверять. Например те, чей id % 10 = 0 или id % 10 = 1 ...
mrdragon9000, я бы не парился с одновременной обработкой job. на рынке даже самые крутые решения, гарантирующие "exact-once-delivery" лукавят, а результат обработки будет же одинаков) Если возьмете нормальное решение вроде RabbitMQ (или выберите что больше нравится) снимет почти весь головняк с этого вопроса.
По очереди = отсутствие многопоточности) я бы наполнял очередь по расписанию заданиями, предварительно их перемешав
Почему бы не попробовать добавить хелпер проверки наличия джоба в очереди и ограничиться одним прогоном но через планировщик? Тогда точно будет кидать в конец и автоматически выбирать воркер