
❓Почему сообщения дублируются при доставке At-least-onceГарантия at-least-once delivery (доставка «как минимум один раз») часто встречается в в качестве решения. На первый взгляд звучит надежно и создается впечатление, что это сообщение точно не потеряется. Но у этой гарантии есть важное следствие — дубликаты неизбежны.Разберёмся, почему это происходит.В основе лежит простая идея: брокер сообщений считает сообщение доставленным только после получения подтверждения (ack) от потребителя. Пока ack не получен, сообщение считается «необработанным» и может быть отправлено повторно.Типичный сценарий дублирования выглядит так:🔹Потребитель получает сообщение🔹Успешно обрабатывает его (например, записывает в базу)🔹Но не успевает отправить ack (или ack теряется)🔹Брокер сообщений считает, что сообщение не обработано🔹И совершает повторную попытку отправкиВ результате одно и то же сообщение обрабатывается дважды.Важно понимать: с точки зрения брокера всё корректно. Он действует по контракту — «лучше отправить ещё раз, чем потерять».➖ Какие существуют причины неполучения ack?🔹сбой сети между консьюмером и брокером сообщений🔹ошибка в консьюмере после обработки, но до отправки ack🔹таймаут обработки (visibility timeout в SQS, session timeout в Kafka)🔹ребалансировкаВот отсюда и происходит природа дупликаторов при различного рода коммуникациях, включая асинхронную.➖ Что с этим делать?Главный подход — идемпотентность. Обработчик должен уметь безопасно обрабатывать одно и то же сообщение несколько раз. На практике это реализуется так:🔹использование уникального ключа для контроля уникальности🔹хранение обработанных запросов в БД🔹обновление вместо вставки в БДНапример, если сообщение создает заказ, перед его созданием будет выполнена проверка на возможность его существования в системе. В случае детекции дубликата, такого сообщение будет игнорироваться и пользователю вернется ответ связанный уже с ранее обработанным сообщением.📌 ВыводПри доставке At-least-once сообщения могут дуб

