#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, он просто вернет ответ, не дожидаясь подтверждения от брокеров
Комментарии:
1. Спасибо, но вопрос в
get()
методе2. так что даже с
acks=0
помощью сget()
мы будем ждать подтверждения от сервера ?3. Нет, это не то, что я написал
4. Функция get() ожидает возврата функции send (), она будет возвращена немедленно, так как не будет искать подтверждения
5. get() вернется немедленно ?