Какие гарантии доставки существуют в Kafka и как они достигаются
1️⃣ Как кратко ответить
В Apache Kafka существуют три гарантии доставки сообщений: "at most once" (не более одного раза), "at least once" (по крайней мере один раз) и "exactly once" (ровно один раз). Эти гарантии достигаются за счет конфигурации продюсеров, брокеров и потребителей, а также использования механизмов подтверждения (acknowledgments), ретрансляции сообщений и транзакций.
2️⃣ Подробное объяснение темы
Apache Kafka — это распределенная платформа потоковой передачи данных, которая обеспечивает надежную доставку сообщений между продюсерами и потребителями. Гарантии доставки в Kafka определяют, сколько раз сообщение может быть доставлено потребителю. Существуют три основных типа гарантий:
-
At Most Once (Не более одного раза):
- Сообщение может быть доставлено либо один раз, либо не доставлено вовсе.
- Эта гарантия достигается, когда продюсер отправляет сообщение без ожидания подтверждения от брокера. Если сообщение теряется в процессе передачи, оно не будет повторно отправлено.
- Применяется в сценариях, где важнее скорость, чем надежность доставки.
-
At Least Once (По крайней мере один раз):
- Сообщение будет доставлено как минимум один раз, но может быть доставлено несколько раз.
- Достигается за счет использования подтверждений от брокера. Продюсер повторно отправляет сообщение, если не получает подтверждение.
- Потребители должны быть готовы обрабатывать дубликаты. Это полезно в сценариях, где потеря данных недопустима.
-
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(), чтобы дождаться подтверждения отправки. - Закрытие продюсера: Гарантируем освобождение ресурсов после завершения работы.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться