Зачем очередь и как сделать её надёжной
Вопрос
Объясни, зачем бэкенду очередь задач и как сделать обработку надёжной.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Отвязать долгую работу от ответа пользователю: письма, PDF, интеграции
Сгладить пики нагрузки и ограничить параллелизм воркеров
At-least-once: задачи могут прийти повторно, обработчики идемпотентные
Повторы с экспоненциальной задержкой и лимитом, затем DLQ
Outbox, если нужно атомарно записать в базу и отправить событие
Выбор инструмента: BullMQ на Redis, RabbitMQ, Kafka для потока событий
Что могут спросить следом
- Чем Kafka отличается от RabbitMQ?
- Как следить, что очередь не растёт?
Разбор
Очередь отделяет приём работы от выполнения. Пользователь оформил заказ, получил ответ за сто миллисекунд, а письмо, чек и выгрузка в учётную систему делаются воркерами фоном. Заодно очередь сглаживает пики: задачи копятся, а воркеры разбирают их с той скоростью, которую выдерживают внешние сервисы.
Надёжность строю из трёх частей. Первое: почти все очереди доставляют at-least-once, поэтому обработчики идемпотентные, с ключом операции и уникальным индексом в базе. Второе: повторы с экспоненциальной паузой и лимитом попыток, а то, что не прошло, уходит в dead letter queue с алертом. Третье: если в одной операции нужно и записать в базу, и отправить событие, использую outbox, чтобы не было записи без события.
В Node-проектах обычно беру BullMQ поверх Redis: повторы, задержки и конкурентность из коробки. Если нужен общий поток событий для многих сервисов с возможностью перечитать историю, это уже Kafka.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.