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

Какую знаешь теорию по Kafka?

2.0 Middle🔥 171 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Apache Kafka — архитектура и теория

Apache Kafka — это распределённая система обмена сообщениями (message streaming platform), разработанная LinkedIn для обработки потоков данных в real-time.

Основные компоненты

1. Архитектура

┌─ Producer → Topic → Partition 0 ─┐
│                                    ├─ Consumer Group
└─ Producer → Topic → Partition 1 ─┘
     ↓         ↓
  Kafka Cluster (Brokers)
     ↓
  Zookeeper (координация)

Topic — логический канал данных, разбит на партиции для масштабируемости.

Broker — сервер Kafka, хранит данные партиций. Кластер состоит из нескольких brokers.

Partition — физическое разбиение topic, обеспечивает параллелизм. Сообщения в партиции упорядочены.

2. Producer и Consumer

Producer — отправляет сообщения в topic:

KafkaProducer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = 
    new ProducerRecord<>("my-topic", "key", "value");
producer.send(record, new Callback() {
    @Override
    public void onCompletion(RecordMetadata metadata, Exception ex) {
        if (ex == null) {
            System.out.println("Sent to partition " + metadata.partition());
        }
    }
});
producer.close();

Consumer — читает сообщения из topic:

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("my-topic"));

while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        System.out.println("Key: " + record.key() + 
                         ", Value: " + record.value() +
                         ", Partition: " + record.partition());
    }
}

Consumer Groups

Consumer Group — несколько consumers, читающих из одного topic параллельно:

  • Каждый consumer в группе читает из уникального набора партиций
  • Если 3 партиции и 2 consumer — один читает 2, второй читает 1
  • Если потребитель упадёт — его партиции перейдут другому (rebalancing)
props.put("group.id", "my-consumer-group");

Гарантии доставки

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

Offset и Commit

Offset — номер позиции сообщения в партиции (0, 1, 2...):

props.put("enable.auto.commit", false); // Ручное управление

// После обработки сообщения
consumer.commitSync(); // или commitAsync()

Если consumer упадёт и перезагрузится, он продолжит с последнего committed offset.

Key Concepts

  • Durability: сообщения хранятся на диске, survives failures
  • Ordering: гарантия порядка только в рамках одной партиции
  • Throughput: может обрабатывать миллионы сообщений в секунду
  • Low latency: задержка < 10ms для доставки

Практический пример: Real-time Processing

@Configuration
@EnableKafka
public class KafkaConfig {
    @Bean
    public ConsumerFactory<String, String> consumerFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }
}

@RestController
public class KafkaListenerExample {
    @KafkaListener(topics = "orders", groupId = "order-group")
    public void listen(String message) {
        processOrder(message);
    }
}

Когда использовать Kafka

  • Event sourcing (история всех событий)
  • Real-time аналитика и мониторинг
  • Stream processing (фильтрация, трансформация потоков)
  • Асинхронная коммуникация между микросервисами
  • Логирование в масштабе

Ключевое отличие от обычного message queue (RabbitMQ): Kafka хранит историю сообщений на диске, позволяя consumers читать с любой точки, не обязательно от конца очереди.