Механизм работы Брокера
Тема гарантий доставок является для меня животрепещущей, не терпится о ней порассуждать. Но для более глубокого понимания процесса следует разобрать базу: как вообще работает брокер.
✏️ - Продюсер
📖 - Читатель
📬 - Брокер
Шаг 1. Публикация
1. ✏️Продюсер устанавливает соединение с 📬Брокером (по протоколу AMQP, MQTT и тд).
2. ✏️Продюсер публикует сообщение в определённый топик (для Kafka).
3. 📬Брокер принимает сообщение и немедленно подтверждает его получение отправителю (это важно для гарантий). Если подтверждение не пришло, ✏️Продюсер может отправить сообщение повторно.
4. 📬Брокер сохраняет сообщение в памяти или на диск (в зависимости от настроек durability).
Шаг 2. Маршрутизация
1. Внутри топика по заранее заданным правилам определяет, в какие очереди должно быть помещено это сообщение.
2. Сообщение помещается в хвост выбранных очередей. Очередь - это и есть место хранения сообщений, ожидающих обработки.
Шаг 3: Доставка потребителю
1. 📖 Читатель, который заранее подписался на очередь, находится в состоянии ожидания.
2. Как только в очереди появляется сообщение, 📬Брокер выталкивает (push-модель, как в RabbitMQ) или позволяет забрать (pull-модель, как в Kafka) это сообщение 📖 Читателю.
3. Ключевой момент: После успешной обработки сообщения 📖 Читатель отправляет 📬 брокеру подтверждение (ACK).
4. Только после получения ACK 📬Брокер окончательно удаляет сообщение из очереди. Если ACK не пришло (consumer упал, таймаут), 📬Брокер считает доставку неудачной и перепосылает сообщение (другому или тому же потребителю).
Шаг 4: Обработка сбоев (на механическом уровне)
• Потеря соединения с 📖 Читателем: 📬Брокер возвращает неподтверждённые (unacked) сообщения обратно в очередь.
• Перезапуск 📬Брокера : Сообщения, объявленные как persistent (постоянные), восстанавливаются с диска.
• Недоступность 📖 Читателей: Сообщения накапливаются в очереди, пока не появится активный потребитель.
Чуть-чуть о гарантиях, чтобы вписать их в контекст
1. Подтверждение от брокера: Гарантия, что сообщение достигло брокера.
2. Сохранение на диск: Гарантия, что сообщение переживёт перезапуск брокера.
3. Подтверждение от потребителя: Гарантия, что сообщение было успешно обработано и может быть удалено. Без ACK — перепосылка.
4. Транзакции/Exactly-Once: Более сложные механизмы
Post #131
115