@megakor
Laravel | Tailwind | Vue.js + Inertia.js

Как организовать парсер с помощью очередей в Laravel Horizon?

Использую Laravel Horizon.
Представим, что есть 20 сайтов, по которым нужно пройтись по всем за +-1 час, просканировать и сохранить результаты в БД. Как это грамотно организовать через очереди?
Нужно удостовериться что задачи по каждому сайту должны идти поочередно. Если в очереди несколько сайтов одновременно, у каждого сайта своя очередь (если сканируется сайт 1 и добавляется в это же время сканирование сайта 2 - остановок в сканировании сайта 1 не должно быть). Чтобы не "ддосить" сайты нужно чтобы задачи выполнялись с каким-то интервалом, желательно распределить равномерно в течение часа.
Я думал сделать это так:
1. Сделать кроны на старт Batch'ей (Bus::batch()) задач и распределить эти 20 сайтов в течение часа (каждые ~3 минуты).
2. У каждого сайта - своя очередь. Т.е. в horizon.php в настройках супервозора будет так:
'queue' => ['site1', 'site2', 'site3' /* ... */, 'site20'],
'balance' => 'auto',
'maxProcesses' => 20, // количество сайтов


Или есть более разумное решение это сделать?
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
JhaoDa
@JhaoDa
LaravelRUS Team
Во-первых, ты путаешь понятие «очередь» и «задание в очереди».

Во-вторых, надо не изобретать какие-то костыли на кроне, а начать читать документацию. Там и про разделение на разные очереди, и про ограничение одновременно исполняемого количества заданий, и про интервалы между выполнением заданий, и много про что ещё.

Если кратко: создаёшь 20 очередей, каждой по одному воркеру с параметром --sleep=1.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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