Проверяет понимание гарантий доставки сообщений в Kafka и их практическое применение.
Kafka — это распределённая система обмена сообщениями, которая обеспечивает различные уровни гарантий доставки. Понимание этих гарантий критически важно для проектирования надёжных приложений, особенно в финансовых и аналитических системах, где потеря или дублирование данных недопустимы.
Существует три основных режима:
Для настройки гарантий используются параметры продюсера и консьюмера. Например, установка acks=all и enable.idempotence=true позволяет достичь exactly-once для продюсера. Консьюмер должен использовать транзакционные чтения и управлять смещениями вручную.
// Пример настройки продюсера для exactly-once
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");
props.put("acks", "all");
props.put("enable.idempotence", "true");
props.put("transactional.id", "my-transactional-id");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.initTransactions();
producer.beginTransaction();
producer.send(new ProducerRecord<>("topic", "key", "value"));
producer.commitTransaction();Для консьюмера важно установить isolation.level=read_committed, чтобы читать только закоммиченные сообщения.
Выбор гарантий зависит от бизнес-требований. Если допустимы редкие потери, можно использовать at-most-once для максимальной производительности. Для большинства систем подходит at-least-once с дедупликацией на стороне потребителя. Exactly-once необходим в финансовых операциях, где дубликаты недопустимы, но это требует дополнительных ресурсов и сложности.
Итог: Понимание гарантий доставки помогает правильно настроить Kafka под конкретные задачи, балансируя между надёжностью и производительностью. Рекомендуется начинать с at-least-once и переходить к exactly-once только при явной необходимости.