Что означает подтверждение (ack) сообщения в RabbitMQ?
- Что такое подтверждение сообщения?
Ack — сигнал брокеру, что сообщение обработано: до него сообщение считается невыполненным и при обрыве соединения вернётся в очередь другому потребителю.
- Nack/reject — отказ: вернуть в очередь или отправить в DLX
- В Spring AMQP режим AUTO подтверждает после успешного метода
- Отсюда at-least-once и идемпотентность
А ещё Prefetch ограничивает число неподтверждённых
Подробно
Именно поэтому подтверждение отправляют после обработки, а не при получении: если потребитель упадёт посередине, брокер не получит подтверждения и передаст сообщение другому — работа не потеряется. Обратная сторона — при повторной доставке обработка должна выдерживать дубли. Отдельно существует подтверждение со стороны издателя, которое сообщает, что брокер принял сообщение на хранение, — это другая гарантия и другая сторона обмена.
Что хотят услышать
- Смысл ack и что без него.
Частые ошибки
- Подтверждать сообщение до фактической обработки.
- Путать подтверждение потребителя с подтверждением издателя.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Издатель подтверждает брокеру, что сообщение отправлено и записано на диск
- ✗Брокер подтверждает потребителю, что очередь создана и готова принимать сообщения
- ✗Сообщение помечается как прочитанное, но остаётся в очереди навсегда
- ✓Потребитель сообщает, что сообщение обработано и его можно удалить
Что спросят дальше
- Чем опасен возврат сообщения в очередь при постоянной ошибке?
- Зачем нужен предварительный лимит выборки (prefetch)?
Разбор темы
- Spring AMQP и RabbitMQ
RabbitTemplate, @RabbitListener, exchanges, bindings, manual ack, retries, DLQ и prefetch.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.