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

Где распределяются партиции?

2.0 Middle🔥 151 комментариев
#Брокеры сообщений

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

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

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

# Распределение Kafka партиций

Партиции в Apache Kafka распределяются следующим образом:

1. Распределение при создании топика

Когда создаётся топик с N партициями и RF (replication factor) > 1:

  • Kafka распределяет партиции равномерно между доступными брокерами
  • Для каждой партиции выбирается лидер и реплики на других брокерах
  • Реплики размещаются на разных брокерах для отказоустойчивости
// Пример конфигурации при создании топика
Properties props = new Properties();
props.put("num.partitions", 3);           // 3 партиции
props.put("replication.factor", 2);      // 2 реплики на каждую
// Kafka автоматически распределит их между брокерами

2. Распределение сообщений по партициям

Производитель может распределять сообщения тремя способами:

С явным ключом: если указан ключ, Kafka использует хеш-функцию для выбора партиции:

Producer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = 
    new ProducerRecord<>("my-topic", "user-123", "data");
// Сообщение попадёт в одну партицию на основе хеша ключа
producer.send(record);

Без ключа (null): сообщения распределяются round-robin по всем партициям:

ProducerRecord<String, String> record = 
    new ProducerRecord<>("my-topic", "data");
// Распределяется равномерно между партициями

С кастомным партиционером:

public class CustomPartitioner implements Partitioner {
    @Override
    public int partition(String topic, Object key, byte[] keyBytes,
                        Object value, byte[] valueBytes,
                        Cluster cluster) {
        // Кастомная логика выбора партиции
        if (key == null) {
            return 0;  // Default партиция
        }
        return Math.abs(key.hashCode()) % cluster.partitionsForTopic(topic).size();
    }
}

3. Балансировка между брокерами

Когда один из брокеров выходит из строя:

  • Лидеры партиций переизбираются
  • Kafka Controller перераспределяет реплики
  • Новые лидеры выбираются из in-sync replicas (ISR)

4. Consumer-группы и распределение

Потребители в группе распределяют партиции между собой:

Properties props = new Properties();
props.put("group.id", "my-consumer-group");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("my-topic"));

// Kafka автоматически назначит партиции потребителям в группе
// Если 3 партиции и 2 потребителя: один получит 2, другой 1

5. Реассигнмент партиций

Это процесс перераспределения реплик при масштабировании:

# Инструмент для управления реассигнментом
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
  --reassignment-json-file reassignment.json \
  --execute

Ключевые принципы

  1. Равномерность — партиции распределяются равномерно для балансировки нагрузки
  2. Отказоустойчивость — реплики на разных брокерах защищают от потери данных
  3. Аффинность — сообщения с одинаковым ключом попадают в одну партицию (сохранение порядка)
  4. Масштабируемость — количество потребителей <= количество партиций для оптимальной работы

Общая стратегия: правильный выбор количества партиций и фактора репликации критичен для достижения нужной пропускной способности и надёжности.