Очереди в Laravel на практике
Вопрос
Как вы используете очереди в Laravel и с какими проблемами сталкивались?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Что выносить: письма, внешние API, отчёты, обработка файлов
Redis и Horizon, отдельные очереди по приоритетам
Идемпотентность и повторы с backoff, failed_jobs и алерты
afterCommit и SerializesModels: свежие данные, отсутствие записи
Перезапуск воркеров после деплоя, утечки памяти, --max-jobs и --max-time
Уникальные задания и блокировки против дублей
Что могут спросить следом
- Что будет, если воркер упадёт посреди задания?
- Как не отправить письмо дважды?
Разбор
В очередь выношу всё, что не обязано выполниться до ответа пользователю: письма, уведомления, вызовы внешних API, генерацию отчётов, обработку загруженных файлов. Обычно это Redis с Horizon: видно очереди, время выполнения, ошибки. Для срочного и медленного заводлю разные очереди, чтобы отчёт на десять минут не задерживал письма.
Главное правило: задание может выполниться больше одного раза. Воркер может упасть после отправки письма, но до подтверждения. Поэтому задания делаю идемпотентными, например проверяю флаг «уже отправлено» или использую ключ идемпотентности у платёжного API. Повторы настраиваю через $tries и $backoff, а упавшие окончательно попадают в failed_jobs и в алерты.
Из типичных граблей: задание, поставленное внутри транзакции, выполнилось раньше коммита и не нашло запись, лечится afterCommit. Воркеры это долгоживущие процессы, после деплоя их перезапускаю queue:restart, а против утечек памяти задаю --max-jobs и --max-time.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.