Sobes.tech
Senior
39

Какие гарантии доставки есть в Kafka? Как работает exactly-once?

Компании, где спрашивали
Uzum

Ответ от нейросети

sobes.tech AI

Kafka обеспечивает три основных уровня гарантии доставки сообщений:

  1. At most once (не более одного раза) — сообщение может быть потеряно, но не будет дублировано.
  2. At least once (минимум один раз) — сообщение гарантированно доставлено, но может быть продублировано.
  3. Exactly once (ровно один раз) — сообщение доставляется и обрабатывается ровно один раз без дублирования.

Для реализации exactly-once в Kafka используется комбинация нескольких механизмов:

  • Идемпотентный продюсер: продюсер присваивает уникальный идентификатор и последовательность сообщений, что позволяет брокеру обнаруживать и отбрасывать дубликаты при повторной отправке.
  • Транзакции: позволяют объединять несколько операций записи в Kafka (например, в разные топики или партиции) в одну атомарную транзакцию.
  • Поддержка транзакций в консьюмерах: консьюмеры могут читать только коммитнутые транзакции, что исключает обработку неполных или частичных данных.

Пример использования транзакций в Java Kafka Producer:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("enable.idempotence", "true");
props.put("transactional.id", "my-transactional-id");

KafkaProducer<String, String> producer = new KafkaProducer<>(props, new StringSerializer(), new StringSerializer());
producer.initTransactions();

try {
    producer.beginTransaction();
    producer.send(new ProducerRecord<>("topic", "key", "value"));
    // другие операции
    producer.commitTransaction();
} catch (Exception e) {
    producer.abortTransaction();
}

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