Вопрос с собеса Middle/Senior на 280-350K 💸
На одном из собесов в продуктовой команде меня спросили: Кейс: Есть система-источник, которая публикует события быстрее, чем система-потребитель успевает их забирать и обрабатывать. Очередь растет, потребитель отстает, нагрузка нестабильная.
Вопрос: Какой механизм брокера сообщений является ключевым, чтобы события не потерялись в такой ситуации – даже если брокер перезапустится или упадет?
Когда источник производит сообщения быстрее, чем потребитель их читает – это нормальный режим для очередей. Сообщения накапливаются, и в этот момент становится понятно, насколько вообще была продумана архитектура.
На собесах тут часто говорят про масштабирование, партиции, фильтрацию, приоритеты – и это все полезно.
Но главная идея в этом вопросе – персистентность сообщений.
Что должно происходить в брокере? Если потребитель не успевает обрабатывать: • Сообщения не должны пропадать • Они должны безопасно ждать своей очереди • Если брокер упал – это не должно превращаться в потерю данных
Это достигается за счет того, что каждое сообщение сохраняется на диск (persisted) до того, как брокер подтвердит его прием.
Проще говоря: 1. Источник отправляет сообщение 2. Брокер физически записывает его в хранилище 3. Только после этого сообщение считается принятым и может ждать обработки 4. Даже если брокер упадет – сообщение никуда не денется
Один раз видел, как на проде при обычной нагрузке терялись данные как раз из-за отсутствия персистентности 🤦♀️
А что с другими механизмами? • Маршрутизация на основе контента (Content-Based Routing) – решает, куда отправить сообщение, но не гарантирует, что оно сохранится • Фильтрация (Message Filtering) – выбирает, какие сообщения передавать, а какие нет • Преобразование протоколов (Protocol Transformation) – чаще про совместимость систем, а не про надежность
Все это полезно, но не решает главную проблему: как не потерять данные, когда очередь переполнена 🤔
Тут важно запомнить, что если источник быстрее потребителя – очередь обязана уметь долго и безопасно хранить данные.
✅ Как ответить на собесе: Когда потребитель отстает, сообщения накапливаются в очереди. Чтобы они не потерялись при сбоях, брокер должен сохранять их на диск до подтверждения приема.
Именно персистентность обеспечивает надежность системы в таких сценариях, все остальное – важные, но вторичные дополнения.
Даже если ты не глубоко работаешь с интеграциями, понимать такие базовые вещи полезно.
Это помогает задавать правильные вопросы архитекторам, разработчикам и заранее видеть риски, которые могут всплыть под нагрузкой или при сбоях 💞