Ответ
В Kafka producer определяет партицию для записи сообщения с помощью partitioner. По умолчанию используется DefaultPartitioner, который:
- Если указан ключ (
key) – партиция вычисляется какhash(key) % количество_партиций. - Если ключа нет – используется 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{})
Важно: один и тот же ключ всегда попадает в одну партицию, обеспечивая порядок сообщений.