Какие есть причины для использования очереди кроме оптимизации ресурсов
Что проверяют
Видите ли вы в очереди архитектурный инструмент, а не только способ разгрузить сервер. Интервьюер ждёт разговора про развязку, надёжность и асинхронность, а следом почти всегда спрашивает про семантику доставки и повторную обработку.
Как отвечать
Причины, которые стоит назвать:
- быстрый ответ пользователю: долгая работа вроде отправки письма, генерации PDF или обработки видео уходит в фон, а HTTP-запрос сразу возвращает
202с ID задачи; - развязка сервисов: отправитель не знает, кто и сколько потребителей обработает событие. Нового потребителя добавляют, не трогая код отправителя;
- надёжность: если потребитель упал, сообщение остаётся в брокере и обработается после перезапуска. Повторы с задержкой, а для сообщений, которые падают стабильно, dead letter queue;
- сглаживание пиков: сервис принимает всплеск, а обработка идёт в своём темпе, без отказов пользователям;
- ограничение скорости к внешним API: воркеры с фиксированной конкуренцией не превышают лимиты стороннего сервиса;
- отложенные и периодические задачи:
countdownиetaу задач Celery, расписание черезcelery beat; - порядок и повторное чтение: в Kafka сообщения внутри партиции упорядочены и хранятся после чтения, новый потребитель может перечитать историю.
Инструменты в Python: Celery с брокером RabbitMQ или Redis, более лёгкие RQ и Dramatiq, arq для asyncio, клиенты Kafka aiokafka и confluent-kafka. Внутри процесса это queue.Queue для потоков и asyncio.Queue для корутин, тот же паттерн производителя и потребителя.
Где спотыкаются
Думают, что очередь гарантирует ровно одну доставку. Обычно это «хотя бы один раз»: при acks_late=True в Celery задача после падения воркера придёт снова, значит, обработчик должен быть идемпотентным.
Не думают о переполнении. Очередь прячет перегрузку, пока лаг не вырастет до часов, поэтому нужны мониторинг длины очереди и ограничение сверху.
Кладут в сообщение ORM-объект или огромный payload. Надёжнее передать ID и прочитать актуальное состояние из базы в момент обработки, иначе потребитель работает с устаревшими данными.