springkafka生产者抛出timeoutexceptions

iaqfqrcu  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(400)

问题
我有一个Kafka设置与三个经纪人在库伯内茨,成立根据指南在https://github.com/yolean/kubernetes-kafka. 从java客户机生成消息时,会出现以下错误消息。

2018-06-06 11:15:44.103 ERROR 1 --- [ad | producer-1] o.s.k.support.LoggingProducerListener    : Exception thrown when sending a message with key='null' and payload='[...redacted...]':
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for topicname-0: 30001 ms has passed since last append

详细设置
侦听器的设置允许来自外部世界的ssl生产者/消费者:

advertised.host.name = null
advertised.listeners = OUTSIDE://kafka-0.mydomain.com:32400,PLAINTEXT://:9092
advertised.port = null
listener.security.protocol.map = PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,OUTSIDE:SSL
listeners = OUTSIDE://:9094,PLAINTEXT://:9092
inter.broker.listener.name = PLAINTEXT
host.name =
port.name = 9092

外部侦听器正在kafka-0.mydomain.com、kafka-1.mydomain.com等上侦听。纯文本侦听器正在任何ip上侦听,因为它们是kubernetes的本地群集。
生产者设置:

kafka:
  bootstrap-servers: kafka.mydomain.com:9092
  properties:
    security.protocol: SSL
   producer:
    batch-size: 16384
    buffer-memory: 1048576 # 1MB
    retries: 1
    ssl:
      key-password: redacted
      keystore-location: file:/var/private/ssl/kafka.client.keystore.jks
      keystore-password: redacted
      truststore-location: file:/var/private/ssl/kafka.client.truststore.jks
      truststore-password: redacted

此外,我设置 linger.ms 在代码中设置为100,这将强制消息在100ms内传输。延迟时间故意设置为较低,因为用例需要最小的延迟。
分析
当代理移动到ssl时,错误开始出现。
在服务器端,一切都按预期运行,日志中没有错误,我可以使用kafka客户机工具手动连接到代理。
错误是间歇性出现的:有时每秒发送30多条消息,有时根本不发送任何消息。它可能会像一个魅力工作几个小时,然后只是垃圾邮件超时一小会儿。
客户端和服务器的时钟是同步的(utc)。
生产端和服务器端的cpu始终保持在20%左右。
可能是什么?

0sgqnhkj

0sgqnhkj1#

这个问题通常发生在生产者比代理速度快的时候,在您的设置中发生这种情况的原因似乎是ssl需要额外的cpu,这可能会减慢代理的速度。但不管怎样,请检查以下内容:
检查你是否以同样的速度产生信息,根据你所说的似乎有尖峰。
另一种可能性是集群中的其他kafka客户机(生产者或消费者)不一定使用相同的主题,这使得这种情况发生,因为代理过载(检查代理cpu/网络)。
为了尽量减少这种保留,你应该增加 buffer-memory 如果设置为大于32mb,则认为32mb是默认值,您将此值设置得较低。你拥有的越低,缓冲区就越容易满,如果发生这种情况,它最多会阻塞 max.block.ms ,请求将在之后超时 request.timeout.ms .
您应该增加的另一个参数是 batch-size ,此参数以字节为单位,而不是以消息数为单位。另外linger.ms应该增加,万一这个生产者消息是在用户请求时间内创建的,不要增加太多,一个好的选择可以是1-4ms。
消息将在 batch.size 已满或需要的时间超过 linger.ms 有更多的数据 batch.size . 在正常情况下,大批量会增加吞吐量,但如果延迟太低,则没有帮助,因为您将在获得足够数据之前发送 batch.size .
还要在生产者日志上重新检查属性是否正确加载。

相关问题