@nopiveb839

При выполнении функции в Laravel запускаемой в Cron каждые 3 минуты, как избежать дублирования?

Всем привет!

Есть функция в Laravel, которую дергает Cron каждые 3 минуты. В этой функции, каждые 3 минуты берутся определенные записи из таблицы БД и их может быть любое количество.
И бывает так, что скрипт запустился но еще не закончил работу, а через 3 минут ызапустился новый и взял те же данные что и старый скрипт, которые он еще не обработал. В итоге получаем дублированные записи.
Как можно в Laravel этого избежать?

Спасибо!
  • Вопрос задан
  • 251 просмотр
Решения вопроса 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Зависит от конкретного поведения, которое вам нужно.
Если хотите, чтобы скрипт выполнялся не чаще, чем раз в три минуты, но при этом всегда в один поток, то есть withoutOverlapping.
Если хотите, чтобы скрипт выполнялся ровно каждые три минуты, но при этом не брал уже обрабатываемые записи, то просто добавьте поле со статусом для каждой из них (он может быть как булевым, так и более сложным) и в самом начале помечайте взятые, а выбирайте только невзятые.
Ответ написан
iMedved2009
@iMedved2009
Не люблю людей
Если используется ларавеловский планировщик:
$schedule->command('command')->withoutOverlapping();


если используется системный крон
*/5 * * * * flock -w 1 /tmp/command-lock php artisan command
Ответ написан
Комментировать
Надо каким-либо способом делать очередь. Сейчас можно сказать стандартный способ это rabbitmq. Можно свою очередь сделать с хранением состояния в БД.
Можно простейший вариант с лок-файлом, когда скрипт при старте создаёт некий файл, а при окончании работы удаляет его. И скрипт не работает если такой файл есть.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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