Вопрос с собеседования · Брокеры сообщений

Чем отличаются at-most-once, at-least-once и exactly-once?

MiddleОчереди и гарантии доставкиKafka
Ещё спрашивают так:
  • Возможна ли доставка ровно один раз?
  • Что такое exactly-once в Kafka?
Коротко

At-most-once — не повторяем: возможны потери, дублей нет. At-least-once — повторяем до подтверждения: потерь нет, дубли возможны. Exactly-once — эффект ровно один раз: достигается не доставкой, а идемпотентностью или транзакциями.

  • Выбор определяется моментом подтверждения: до обработки или после
  • Kafka EOS: идемпотентный продюсер + транзакции для цепочек «прочитать — обработать — записать в Kafka»
  • С внешней базой — offset и результат в одной транзакции или идемпотентная запись

А ещё На практике: at-least-once + идемпотентный обработчик

Подробно

At-most-once — сообщение отправляется или подтверждается один раз без повторов. Потеря при сбое возможна. Подходит для телеметрии, где потеря точки не важна, а дубль исказит.

At-least-once — повторять, пока не будет подтверждения. Потерь нет, но если обработка прошла, а подтверждение потерялось, будет повтор. Это стандарт для бизнес-событий.

Exactly-once в строгом смысле — доставка ровно одна — в распределённой системе с отказами недостижима: отправитель не может отличить потерянное сообщение от потерянного подтверждения. Достигают эффекта ровно один раз:

  • идемпотентность — повтор не меняет результат (дедупликация по id);
  • транзакции Kafka — чтение offset, запись результатов в выходные топики и коммит offset атомарны (isolation.level=read_committed у потребителей). Работает в пределах Kafka (Kafka Streams с processing.guarantee=exactly_once_v2);
  • атомарность с внешним хранилищем — сохранять offset в той же базе и той же транзакции, что и результат.

Внешние побочные эффекты (письмо, HTTP-вызов) транзакцией Kafka не покрыты — только идемпотентностью на той стороне.

Что хотят услышать

  • Определения трёх семантик и их компромиссы.
  • Почему строгое exactly-once недостижимо.
  • Как получают эффект ровно один раз.

Частые ошибки

  • Считать, что включение exactly-once в Kafka делает идемпотентными внешние вызовы.
  • Выбирать at-most-once для бизнес-событий.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Это уровни приоритета сообщений в брокере
  • ✓at-most-once — потери без дублей; at-least-once — дубли без потерь; exactly-once — ни того ни другого
  • ✗at-most-once — дубли без потерь; at-least-once — потери без дублей; exactly-once — без повторов только у producer
  • ✗Это разные транспорты: HTTP, AMQP, MQTT

Что спросят дальше

  • Как работает идемпотентный producer в Kafka?
  • Почему сквозной exactly-once так сложен?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования