← Назад ко всем вопросам

Какие гарантии доставки существуют в Kafka и как они достигаются

1️⃣ Как кратко ответить

В Apache Kafka существуют три гарантии доставки сообщений: "at most once" (не более одного раза), "at least once" (по крайней мере один раз) и "exactly once" (ровно один раз). Эти гарантии достигаются за счет конфигурации продюсеров, брокеров и потребителей, а также использования механизмов подтверждения (acknowledgments), ретрансляции сообщений и транзакций.

2️⃣ Подробное объяснение темы

Apache Kafka — это распределенная платформа потоковой передачи данных, которая обеспечивает надежную доставку сообщений между продюсерами и потребителями. Гарантии доставки в Kafka определяют, сколько раз сообщение может быть доставлено потребителю. Существуют три основных типа гарантий:

  1. At Most Once (Не более одного раза):

    • Сообщение может быть доставлено либо один раз, либо не доставлено вовсе.
    • Эта гарантия достигается, когда продюсер отправляет сообщение без ожидания подтверждения от брокера. Если сообщение теряется в процессе передачи, оно не будет повторно отправлено.
    • Применяется в сценариях, где важнее скорость, чем надежность доставки.
  2. At Least Once (По крайней мере один раз):

    • Сообщение будет доставлено как минимум один раз, но может быть доставлено несколько раз.
    • Достигается за счет использования подтверждений от брокера. Продюсер повторно отправляет сообщение, если не получает подтверждение.
    • Потребители должны быть готовы обрабатывать дубликаты. Это полезно в сценариях, где потеря данных недопустима.
  3. Exactly Once (Ровно один раз):

    • Сообщение доставляется ровно один раз, без дубликатов.
    • Это самая сложная гарантия, достигаемая с помощью транзакций в Kafka. Продюсеры и потребители должны быть настроены на использование транзакций, чтобы обеспечить атомарность операций.
    • Подходит для критически важных систем, где дублирование или потеря данных недопустимы.

Как достигаются гарантии

  • Продюсеры:

    • Конфигурация acks определяет, сколько подтверждений требуется от брокеров. Значение acks=0 обеспечивает "at most once", acks=1 или acks=all — "at least once".
    • Для "exactly once" продюсеры должны использовать транзакции, что требует включения параметра enable.idempotence=true.
  • Брокеры:

    • Брокеры подтверждают получение сообщений и сохраняют их в журнале. Конфигурация репликации и синхронизации влияет на надежность доставки.
    • Для "exactly once" требуется поддержка транзакций на уровне брокеров.
  • Потребители:

    • Потребители должны обрабатывать дубликаты для "at least once" и использовать транзакции для "exactly once".
    • Автоматическое смещение (auto.offset.commit) может быть настроено для управления подтверждением обработки сообщений.

Пример кода

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
​
// Для "at least once" гарантии
props.put("acks", "all"); // Требуем подтверждения от всех реплик
​
// Для "exactly once" гарантии
props.put("enable.idempotence", "true"); // Включаем идемпотентность
​
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
​
ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value");
​
try {
    producer.send(record).get(); // Блокирующий вызов для получения подтверждения
} catch (Exception e) {
    e.printStackTrace();
} finally {
    producer.close();
}
  • Конфигурация продюсера: Устанавливаем параметры для подключения к брокеру и сериализации ключей и значений.
  • Гарантия "at least once": Устанавливаем acks=all, чтобы продюсер ждал подтверждения от всех реплик.
  • Гарантия "exactly once": Включаем идемпотентность, чтобы избежать дублирования сообщений.
  • Отправка сообщения: Используем метод send() с блокирующим вызовом get(), чтобы дождаться подтверждения отправки.
  • Закрытие продюсера: Гарантируем освобождение ресурсов после завершения работы.

Тема: Kafka и брокеры
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки