Kafka
Средний
Что такое партиции в Kafka и зачем они нужны?
Партиции в Kafka
Что такое партиция:
Topic разбит на partitions — упорядоченные, неизменяемые логи.
Topic: orders
├── Partition 0: [msg0, msg1, msg2, ...]
├── Partition 1: [msg0, msg1, msg2, ...]
└── Partition 2: [msg0, msg1, msg2, ...]
Зачем нужны:
1. Параллелизм
Consumer Group:
├── Consumer 1 ← Partition 0
├── Consumer 2 ← Partition 1
└── Consumer 3 ← Partition 2
2. Масштабирование
- Больше партиций = больше throughput
- Распределение по брокерам
3. Порядок сообщений
- Гарантируется только внутри партиции
- Не гарантируется между партициями
Как выбирается партиция:
// 1. Явно указана
producer.send(new ProducerRecord<>("orders", 0, key, value));
// 2. По ключу (хеш)
producer.send(new ProducerRecord<>("orders", "user-123", value));
// partition = hash(key) % num_partitions
// 3. Round-robin (без ключа)
producer.send(new ProducerRecord<>("orders", null, value));
Гарантия порядка по ключу:
// Все события пользователя в одной партиции
producer.send(new ProducerRecord<>("events", userId, event));
// Порядок сохраняется для одного userId
Сколько партиций создавать:
Формула: max(throughput / producer_throughput,
throughput / consumer_throughput)
Пример:
- Нужно: 100 MB/s
- 1 consumer: 10 MB/s
- Минимум: 100 / 10 = 10 партиций
Репликация:
Partition 0:
├── Leader (Broker 1) ← Все read/write
├── Follower (Broker 2)
└── Follower (Broker 3)
- replication.factor = 3
- min.insync.replicas = 2
Consumer Group и партиции:
# Consumers <= Partitions используются
# Consumers > Partitions — лишние idle
3 partitions, 3 consumers: OK (1:1)
3 partitions, 2 consumers: OK (1:1.5)
3 partitions, 4 consumers: 1 consumer idle
Rebalancing:
При добавлении/удалении consumer происходит перераспределение партиций.
// Стратегии назначения:
// RangeAssignor — по диапазонам
// RoundRobinAssignor — по кругу
// StickyAssignor — минимум перемещений
Готовитесь к собеседованию?
ENIGMA AI — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно