Как поместить данные в конкретную партицию принудительно

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

Ответ

В 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)

Важные моменты:

  1. Партиция должна существовать (0 <= partition < total_partitions)
  2. Это нарушает балансировку нагрузки, используйте только когда порядок сообщений критичен
  3. Для гарантированного порядка нужно также учитывать max.in.flight.requests.per.connection=1

Альтернатива - использовать ключ сообщения для консистентного хеширования в одну партицию.