Получить доступ

Чем отличаются 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 + идемпотентный обработчик

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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 для бизнес-событий.

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

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

Показать варианты и ответ
  • ✗Это разные транспорты: HTTP, AMQP, MQTT
  • ✗Это уровни приоритета сообщений в брокере
  • ✓at-most-once — возможны потери без дублей; at-least-once — без потерь, но с дублями (нужна идемпотентность); exactly-once — без потерь и дублей, обычно в рамках одной системы
  • ✗Все три эквивалентны и различаются только названиями

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем