Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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");
Гарантии доставки
- At-most-once — может потеряться
- At-least-once — может быть дублировано
- 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 читать с любой точки, не обязательно от конца очереди.