Какой способ доставки сообщений (at-least-once, at-most-once, exactly-once) был реализован в вашей системе с Kafka?

«Какой способ доставки сообщений (at-least-once, at-most-once, exactly-once) был реализован в вашей системе с Kafka?» — вопрос из категории Потоковая обработка и Kafka, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В последнем проекте мы реализовали гарантию exactly-once для критически важных финансовых транзакций, обрабатываемых через Apache Kafka.

Реализация:

  1. Идемпотентный продюсер: Настройка продюсера с enable.idempotence=true гарантирует, что сообщение будет отправлено в партицию ровно один раз, даже при повторных попытках.
    // Пример настройки на Java
    Properties props = new Properties();
    props.put("bootstrap.servers", "kafka-broker:9092");
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("enable.idempotence", true); // Ключевая настройка
    props.put("acks", "all");
    props.put("retries", Integer.MAX_VALUE);
  2. Транзакции Kafka: Использовали транзакционное API для атомарной записи consumed-processed-produced в рамках одной транзакции. Это предотвращает дублирование или потерю данных при сбоях в консьюмере.
  3. Дедупликация на стороне приложения: Для дополнительной надежности в целевую базу данных (PostgreSQL) запись производилась с проверкой уникальности по бизнес-ключу (например, transaction_id).

Итог: Комбинация идемпотентности Kafka, транзакций и бизнес-дедупликации позволила достичь семантики exactly-once, что было необходимо для корректного учета платежей.