Ответ
В Kafka можно явно указать партицию при отправке сообщения через Partition в sarama.ProducerMessage. Пример:
producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, nil)
if err != nil {
log.Fatal(err)
}
msg := &sarama.ProducerMessage{
Topic: "test-topic",
Partition: 2, // явное указание партиции
Value: sarama.StringEncoder("Hello Kafka"),
}
partition, offset, err := producer.SendMessage(msg)
Важные моменты:
- Партиция должна существовать (0 <= partition < total_partitions)
- Это нарушает балансировку нагрузки, используйте только когда порядок сообщений критичен
- Для гарантированного порядка нужно также учитывать
max.in.flight.requests.per.connection=1
Альтернатива - использовать ключ сообщения для консистентного хеширования в одну партицию.