Как мы можем быстро написать одно сообщение (не пакет) в kafka?

Я новичок в Golang и Kafka, и я использую segmentio kafka-go для подключения к серверу Kafka с помощью Golang. На данный момент я хочу отправить каждое событие пользователя в Kafka, поэтому я хочу отправить одно сообщение (а не в пакетном режиме), но поскольку операция записи, предоставляемая этой библиотекой, занимает одинаковое время как для пакета, так и для одного сообщения, она занимает много времени. Есть ли способ быстро написать одно сообщение, чтобы я мог отправить миллион событий в kafka за меньшее время?

Я тестировал его для одного сообщения и пакетных сообщений, это занимает одинаковое время (минимум было 10 мс).


person Suraj Singh    schedule 03.09.2019    source источник


Ответы (2)


Я думаю, что ваша проблема заключается только в WriterConfig.

Например, если ваша конфигурация выглядит как пример в документации segmentio/kafka-go:

w := kafka.NewWriter(kafka.WriterConfig{
    Brokers:      []string{"localhost:9092"},
    Topic:        "topic-A",
    Balancer:     &kafka.LeastBytes{},
})

Вы можете попробовать установить размер пакета и время ожидания пакета:

w := kafka.NewWriter(kafka.WriterConfig{
    Brokers:      []string{"localhost:9092"},
    Topic:        "topic-A",
    Balancer:     &kafka.LeastBytes{},
    BatchSize:    1,
    BatchTimeout: 10 * time.Millisecond,
})

Это происходит потому, что kafka-go по умолчанию ждет 1 секунду, пока пакет не достигнет максимального размера, который по умолчанию составляет 100 сообщений, как мы можем видеть в код.

Надеюсь, это поможет вам.


Обновление: имейте в виду, что отправка сообщений по одному замедляет процесс. Например: пакетная отправка 100 сообщений заняла на моем компьютере 0,0107 с. Отправка тех же 100 сообщений по одному заняла 0,0244 с.

person Odilon    schedule 09.09.2019

Я мало что знаю о голанге. Но следующая функция, использующая Writer.WriteMessages, имеет возможность синхронной отправки. .

Быстрая запись (используя синхронную отправку) на самом деле зависит от времени кругового обхода вашей сети, то есть времени, необходимого для отправки сообщения в Kafka, плюс время, необходимое для получения подтверждения от Kafka.

Если вы используете синхронную отправку, ваша отправка будет заблокирована до тех пор, пока не будет получено подтверждение. Таким образом, чтобы сделать это быстрее, один из способов — уменьшить количество подтверждений. Лучше установить его равным 1 (это означает, что лидер записал сообщение в свой журнал, но оно не реплицируется на последователей). Но это может привести к потерям, если лидер выйдет из строя и сообщение не будет реплицировано.

Итак, вы можете установить его на acks=all и изменить min.insync.replicas=2 в теме. Чем меньше значение, тем быстрее возвращается ваш send() и тем быстрее он может отправить следующее сообщение в Kafka.

person JavaTechnical    schedule 03.09.2019