Будет ли Kafka Producer всегда ожидать значения, указанного linger.ms , перед отправкой запроса?

#apache-kafka #spring-kafka #kafka-producer-api

#apache-kafka #spring-kafka #kafka-producer-api

Вопрос:

Согласно LINGER_MS_DOC в классе ProducerConfig java:

«Производитель группирует все записи, которые поступают между отправками запроса, в один пакетный запрос. Обычно это происходит только при загрузке, когда записи поступают быстрее, чем они могут быть отправлены. Однако в некоторых случаях клиент может захотеть уменьшить количество запросов даже при умеренной нагрузке. Этот параметр выполняет это, добавляя небольшую искусственную задержку; то есть вместо немедленной отправки записи производитель будет ждать до заданной задержки, чтобы разрешить отправку других записей, чтобы посылки можно было объединить. Это можно рассматривать как аналог алгоритма Нейгла в TCP. Этот параметр задает верхнюю границу задержки для пакетной обработки: как только мы получим количество записей «BATCH_SIZE_CONFIG» для раздела, оно будет отправлено немедленно, независимо от этого параметра, однако, если у нас накоплено меньше этого количества байтов для этого раздела, мы «задержимся» на указанное время в ожидании дополнительных записейчтобы появиться. Этот параметр по умолчанию равен 0 (т. Е. Без задержки). Например, установка «LINGER_MS_CONFIG = 5» приведет к уменьшению количества отправленных запросов, но добавит до 5 мс задержки к записям, отправленным при отсутствии нагрузки «.

Я искал предложенное значение для linger.ms но нигде не было найдено более высокого значения, предложенного для этого. Для большинства мест упоминается 5 мс linger.ms .

Для тестирования я установил для «batch.size» значение 16384 (16 КБ) и «linger.ms » до 60000 (60 секунд) в соответствии с документом, я чувствовал, что если я отправлю сообщение размером> 16384 байт, то производитель не будет ждать и отправит сообщение немедленно, но я ненаблюдая то же поведение.

Я отправляю события размером> 16384 байт, но он все еще ожидает 60 секунд. Мне не хватает понимания назначения «batch.size»? Мое понимание «batch.size» и «linger.ms «заключается в том, что в зависимости от того, что встретится первым, сообщения / пакет будут отправлены.

В этом случае, если это будет минимальное время ожидания и не отдавать предпочтение «batch.size», то я предполагаю, что установка высокого значения для linger.ms это неправильно.

Вот свойства kafka, используемые в yaml:

   producer:
    properties:
      acks: all
      retries: 5
      batch:
        size: 16384
      linger:
        ms: 10
      max:
        request:
          size: 1046528
  

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

1. Применяете ли вы какое-либо сжатие, которое может уменьшить размер сообщения?

2. Сжатие не применяется.

3. Возможно ли поделиться минимально воспроизводимым примером?

4. Я добавил конфигурацию YAML, используемую для kafka producer . До сих пор я наблюдал, что производитель никогда не ждет больше, чем linger.ms время, и он никогда не отправляет запрос, если общий размер сообщения меньше, чем batch.size и затраченное время также меньше, чем linger.ms . Основной вопрос: может ли производитель Kafka отправить запрос, если достигнут batch.size, но прошедшее время меньше linger.ms ?