Как producer определеяет в какую партицию нужно писать

«Как producer определеяет в какую партицию нужно писать» — вопрос из категории Брокеры сообщений, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Kafka producer определяет партицию для записи сообщения с помощью partitioner. По умолчанию используется DefaultPartitioner, который:

  1. Если указан ключ (key) – партиция вычисляется как hash(key) % количество_партиций.
  2. Если ключа нет – используется round-robin для балансировки нагрузки.

Можно указать кастомный partitioner, реализовав интерфейс Partitioner:

type MyPartitioner struct{}

func (p *MyPartitioner) Partition(msg *sarama.ProducerMessage, numPartitions int32) (int32, error) {
    // Логика выбора партиции
    return 0, nil
}

config := sarama.NewConfig()
config.Producer.Partitioner = sarama.NewCustomPartitioner(&MyPartitioner{})

Важно: один и тот же ключ всегда попадает в одну партицию, обеспечивая порядок сообщений.