Ответ
Партиции в Kafka — это основной механизм для достижения параллелизма и горизонтального масштабирования. Каждый топик (topic) делится на одну или несколько партиций. Это позволяет распределять данные и нагрузку по нескольким брокерам в кластере.
Ключевые роли и свойства партиций:
- Масштабируемость: Данные одного топика могут храниться и обрабатываться на нескольких серверах (брокерах), что увеличивает пропускную способность как на запись, так и на чтение.
- Упорядоченность: Kafka гарантирует строгий порядок сообщений только в пределах одной партиции. Сообщения в разных партициях одного топика не имеют гарантированного порядка относительно друг друга.
- Параллельная обработка: Потребители (consumers) из одной группы могут читать данные из разных партиций параллельно. Каждая партиция может быть назначена только одному потребителю в рамках группы, что позволяет эффективно распараллеливать обработку.
- Отказоустойчивость: Каждая партиция может иметь несколько реплик, распределенных по разным брокерам. Одна из реплик является лидером (leader), а остальные — последователями (followers). Это обеспечивает сохранность данных при сбое одного из брокеров.
Как работает партиционирование?
По умолчанию, если у сообщения есть ключ, продюсер вычисляет хэш от ключа и по нему определяет номер партиции. Это гарантирует, что все сообщения с одинаковым ключом попадут в одну и ту же партицию, сохраняя порядок для связанных данных (например, все события для одного пользователя).
// Пример отправки сообщения с ключом для автоматического партиционирования
producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, nil)
if err != nil {
log.Fatal(err)
}
// Сообщения с одинаковым ключом "user-123" попадут в одну и ту же партицию
msg := &sarama.ProducerMessage{
Topic: "user_events",
Key: sarama.StringEncoder("user-123"),
Value: sarama.StringEncoder("User logged in"),
}
partition, offset, err := producer.SendMessage(msg)