Чем отличаются at-most-once, at-least-once и exactly-once?
- Возможна ли доставка ровно один раз?
- Что такое 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 так сложен?
Разбор темы
- Очереди, pub/sub и гарантии доставки
Зачем брокер сообщений, queue против pub/sub, три семантики доставки, роль идемпотентности и компромисс порядок/масштаб.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.