Ответ
Это семантики (гарантии) доставки сообщений в распределенных системах, таких как брокеры сообщений (Kafka, RabbitMQ) или RPC-вызовы.
At-Most-Once (Не более одного раза)
Это самая простая и быстрая гарантия. Система делает одну попытку доставить сообщение. Если во время доставки или обработки происходит сбой (например, падение сети или недоступность сервиса-получателя), сообщение будет потеряно.
- Гарантирует: Сообщение будет обработано 0 или 1 раз.
- Проблема: Возможна потеря данных.
- Когда использовать: Когда производительность важнее 100% надежности. Например, сбор некритичных логов, метрик, аналитических событий, где потеря малой части данных допустима.
At-Least-Once (Не менее одного раза)
Это наиболее распространенная гарантия. Система будет повторять попытки доставить сообщение до тех пор, пока не получит подтверждение (acknowledgement) от получателя.
- Гарантирует: Сообщение будет обработано 1 или более раз.
- Проблема: Возможны дубликаты сообщений. Это происходит, если получатель обработал сообщение, но упал до того, как отправил подтверждение. Отправитель, не получив подтверждения, отправит сообщение повторно.
- Ключевое требование: Обработчик сообщений должен быть идемпотентным. Это значит, что повторная обработка одного и того же сообщения не изменит состояние системы. Например, операция
UPDATE user SET balance = 100
идемпотентна, аUPDATE user SET balance = balance + 100
— нет.
Exactly-Once (Ровно один раз)
Самая строгая и сложная в реализации гарантия. Система гарантирует, что каждое сообщение будет доставлено и обработано ровно один раз, без потерь и дублей.
- Гарантирует: Сообщение будет обработано строго 1 раз.
- Как достигается: Обычно это комбинация
At-Least-Once
на уровне доставки и механизмов дедупликации на стороне получателя. Например, получатель сохраняет ID обработанных сообщений в транзакции вместе с результатом обработки. При получении нового сообщения он сначала проверяет, не было ли оно уже обработано. - Когда использовать: В критически важных системах, где недопустимы ни потери, ни дубликаты. Например, в банковских транзакциях или системах биллинга.
Сравнительная таблица
Гарантия | Описание | Плюсы | Минусы | Ключевое требование |
---|---|---|---|---|
At-Most-Once | Доставка не более 1 раза | Высокая производительность, простота | Возможна потеря сообщений | - |
At-Least-Once | Доставка не менее 1 раза | Надежность, нет потерь | Возможны дубликаты | Идемпотентность обработчика |
Exactly-Once | Доставка ровно 1 раз | Максимальная надежность | Сложность реализации, снижение производительности | Транзакционность, дедупликация |