надёжность
Всё, что дольше секунды, должно уходить в фон
Отправка письма, генерация отчёта, обработка записи. Пока это делается в запросе пользователя, оно однажды не сделается.
Операция, выполняемая прямо в HTTP-запросе, живёт ровно столько, сколько браузер готов ждать. Пользователь закрыл вкладку — задача умерла на середине. Провайдер письма ответил ошибкой — письмо потеряно навсегда, потому что повторять некому. Отчёт строится сорок секунд, и всё это время пользователь смотрит на спиннер, гадая, работает оно или нет.
Очередь превращает эту хрупкость в инженерную задачу с известным решением. Работа кладётся в очередь, обрабатывается отдельным процессом, при падении повторяется с задержкой, а после нескольких неудач попадает в отдельный список, где её видит человек. Пользователь получает не спиннер, а обещание и уведомление. В Partnetix за это отвечают Redis и BullMQ: выплаты, уведомления, тяжёлые операции живут в очередях, а не в запросе.
Что ломается, пока это делают руками
- Долгая операция в запросе умирает вместе с вкладкой пользователя.
- Внешний сервис отвечает ошибкой, и повторить некому.
- Повтор без защиты приводит к двойной отправке и двойному списанию.
- Упавшие задачи никто не видит, пока не спросит клиент.
Что происходит с задачей при сбое
| Событие | Без очереди | С очередью |
|---|---|---|
| Пользователь закрыл вкладку | Операция оборвалась | Работа уже в очереди, идёт своим ходом |
| Внешний сервис недоступен | Ошибка пользователю | Повтор с нарастающей задержкой |
| Повтор прошёл дважды | Двойная отправка или списание | Задача идемпотентна, второй раз ничего не делает |
| Задача упала пять раз | Тишина | Уезжает в список неудач, человек видит |
| Пик нагрузки | Всё замедляется для всех | Очередь растёт, интерфейс отвечает как обычно |
Что входит
- очереди с приоритетами и ограничением скорости
- повторы с нарастающей задержкой
- идемпотентность: повтор не удваивает эффект
- список неудачных задач и ручной перезапуск
- прогресс и уведомление пользователю по завершении
- мониторинг длины очереди и времени обработки
Для кого
продуктам, где что-то отправляется, считается или генерируется дольше секунды.
Услуга: Веб-приложения и сервисы Кейс по теме: Partnetix — PRM-платформа для партнёрских программ
Частые вопросы
- Нам хватит cron.
- Хватит, пока задача одна и падение не страшно. Cron не умеет повторять, приоритизировать и показывать, что именно не выполнилось. Это разные инструменты, а не разные названия одного.
- Очередь — это лишняя инфраструктура.
- Это Redis и один процесс-обработчик. Дороже обходится письмо, которое клиент не получил, и никто об этом не узнал.
Есть процесс, который держится на людях?
Опишите его — скажу, что здесь автоматизируется, а что не стоит трогать.
Обсудить проект