Поведение Кафки с acks=0 и синхронным производителем

#apache-kafka

Вопрос:

Каково поведение синхронного производителя, когда мы устанавливаем acks=0

 producer.send(record).get();
 

Приведенное выше утверждение вернется немедленно или мы будем ждать ответа ( RecordMetadata ) ?

Другими словами, правильно ли говорить, что с acks=0 и send().get() мы все равно будем ждать подтверждения/ответа от сервера ?

Есть ли какие-то объяснения в документации apache Kafka ?

Ответ №1:

Метод send() является асинхронным. При вызове он добавляет запись в буфер ожидающих отправки записей и немедленно возвращает. Это позволяет производителю объединять отдельные записи для повышения эффективности.

acks=0, если значение равно нулю, то производитель вообще не будет ждать никаких подтверждений от сервера. Запись будет немедленно добавлена в буфер сокета и будет считаться отправленной. В этом случае нельзя гарантировать, что сервер получил запись, и конфигурация повторных попыток не вступит в силу (поскольку клиент обычно не знает о каких-либо сбоях). Смещение, возвращаемое для каждой записи, всегда будет равно -1.

Функция Send() возвращает java.util.concurrent.Будущее

get() При необходимости ожидает завершения вычисления, а затем извлекает его результат.

Так что на ваш вопрос get() не будет проигнорирован, но ему просто не нужно будет ждать , пока что-нибудь завершится, потому что send() немедленно вернет запрос, не дожидаясь подтверждения от брокеров,

Так что ваше утверждение ложно

Как уже было сказано send() , асинхронная функция , которая возвращает future , в будущем есть функция, вызываемая get() , поэтому она будет ждать ответа, вы можете прочитать код: Отправитель и производитель кафка в проекте github, если ack=0, он просто вернет ответ, не дожидаясь подтверждения от брокеров

https://github.com/apache/kafka/blob/98bd590718658f3af2d7f1ff307d1d170624f199/clients/src/main/java/org/apache/kafka/clients/producer/internals/Sender.java#L579

Комментарии:

1. Спасибо, но вопрос в get() методе

2. так что даже с acks=0 помощью с get() мы будем ждать подтверждения от сервера ?

3. Нет, это не то, что я написал

4. Функция get() ожидает возврата функции send (), она будет возвращена немедленно, так как не будет искать подтверждения

5. get() вернется немедленно ?