Получение TimeoutException для некоторых сообщений при отправке в тему Кафки - PullRequest
0 голосов
/ 18 октября 2019
Exception Stacktrace:
org.springframework.kafka.core.KafkaProducerException: Failed to send; nested exception is org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for ****-656 due to 30037 ms has passed since batch creation plus linger time
      at org.springframework.kafka.core.KafkaTemplate$1.onCompletion(KafkaTemplate.java:255) ~[spring-kafka-1.1.6.RELEASE.jar!/:?]
      at org.apache.kafka.clients.producer.internals.RecordBatch.done(RecordBatch.java:109) ~[kafka-clients-0.10.1.1.jar!/:?]
      at org.apache.kafka.clients.producer.internals.RecordBatch.maybeExpire(RecordBatch.java:160) ~[kafka-clients-0.10.1.1.jar!/:?]
      at org.apache.kafka.clients.producer.internals.RecordAccumulator.abortExpiredBatches(RecordAccumulator.java:245) ~[kafka-clients-0.10.1.1.jar!/:?]
      at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:212) ~[kafka-clients-0.10.1.1.jar!/:?]
      at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:135) ~[kafka-clients-0.10.1.1.jar!/:?]
      at java.lang.Thread.run(Thread.java:745) [?:1.8.0_77]

Получено указанное выше исключение в среде PROD в первый день развертывания для некоторых сообщений kafka. Откажитесь от изменений от PROD. В Stage env я никогда не видел этого исключения во время тестирования. Как только я смог воспроизвести исключение, но это было только один раз, я мог бы запустить 10 раз. Теперь у меня нет руководства о том, как найти RCA для этой проблемы?

Я публикую конфигурацию отправителя Kafka, как показано ниже,

retries=3
retryBackoffMS=500
lingerMS=30
autoFlush=true
acksConfig=all
kafkaServerConfig=***<Can't post here>
reconnectBackoffMS=200
compressionType=snappy
batchSize=1000000
maxBlockMS=500000
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>1.1.8.RELEASE</version>
        </dependency>

1 Ответ

0 голосов
/ 18 октября 2019

Это исключение в основном говорит о том, что записи в буфере достигают тайм-аута.

https://cwiki.apache.org/confluence/display/KAFKA/KIP-91+Provide+Intuitive+User+Timeouts+in+The+Producer?source=post_page-----fa3910d9aa54----------------------#KIP-91ProvideIntuitiveUserTimeoutsinTheProducer-TestPlan

В stg вы не видите это исключение, потому что prod env более загружен.

Можете ли вы обновить версию spring-kafka? Ваш клиент kafka сильно отстает от новейшей версии. https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka/1.1.8.RELEASE, который использует kafka 0.10.x и теперь уже 2.3.x

Если вы можете использовать новейшую версию, вы можете установить delivery.timeout.ms выше

Если вы не можете обновитьдля более новой версии вы должны поиграться с linger.ms и request.timeout.ms (попробуйте увеличить их)

Кроме того, по умолчанию повторные попытки являются максимальными целыми числами, и, очевидно, ваши повторные попытки: 3 не будут очень практичными. Если вы не хотите постоянно подключаться, 30 более практично. https://docs.confluent.io/current/installation/configuration/producer-configs.html или https://kafka.apache.org/documentation/#producerconfigs

Обратите внимание, что обе ссылки указывают на текущую версию

...