> Как работает масштабирование Kafka: репликация и шардирование (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

Масштабирование Kafka основано на двух ключевых механизмах: шардирование (разбиение данных на партиции) и репликация (копирование партиций для отказоустойчивости).

Шардирование (Partitioning): Каждый топик делится на несколько партиций. Партиция - это упорядоченный, неизменяемый лог сообщений. Сообщения распределяются по партициям с помощью ключа (key) или циклически (round-robin). Партиции распределяются по брокерам кластера, что позволяет:

  • Параллельно читать и писать данные (каждая партиция обрабатывается независимо).
  • Горизонтально масштабировать пропускную способность - добавление брокеров увеличивает количество партиций и, соответственно, параллелизм.

Репликация (Replication): Каждая партиция имеет конфигурируемое количество реплик (обычно 3). Одна реплика - лидер (leader), остальные - фолловеры (followers). Лидер обрабатывает все запросы на запись и чтение для данной партиции. Фолловеры пассивно копируют данные от лидера (fetch-запросы). Если лидер выходит из строя, один из фолловеров автоматически становится новым лидером (выборы лидера через ZooKeeper или KRaft). Это обеспечивает:

  • Отказоустойчивость: потеря брокера не приводит к потере данных.
  • Доступность: чтение и запись продолжаются после переключения лидера.

Пример в Go (используем библиотеку segmentio/kafka-go):

GO
import "github.com/segmentio/kafka-go"
// Настройка продюсера с указанием партиции (шардирование)
writer := &kafka.Writer{
Addr: kafka.TCP("localhost:9092"),
Topic: "my-topic",
Balancer: &kafka.Hash{},
}
// Отправка сообщения с ключом (определяет партицию)
err := writer.WriteMessages(context.Background(), kafka.Message{
Key: []byte("user123"),
Value: []byte("data"),
})

Важные параметры:

  • replication.factor - количество реплик (например, 3).
  • min.insync.replicas - минимальное количество синхронизированных реплик для подтверждения записи (например, 2).
  • acks - уровень подтверждения (all, 1, 0).

Таким образом, шардирование обеспечивает масштабирование производительности, а репликация - надежность и доступность.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью