【问题标题】:How to fix kafka.common.errors.TimeoutException: Expiring 1 record(s) xxx ms has passed since batch creation plus linger time如何修复 kafka.common.errors.TimeoutException: Expiring 1 record(s) xxx ms has been given since batch creation plus linger time
【发布时间】:2020-07-18 08:26:49
【问题描述】:

我正在使用 kafka_2.11-2.1.1 和 Producer 使用 spring 2.1.0.RELEASE。

我在向 Kafka 主题发送消息时使用 spring,我的生产者生成了很多 TimeoutExceptions

org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for COMPANY_INBOUND--19: 229 ms has passed since batch creation plus linger time

我正在使用以下 kafka 生产者设置

acks: 1
retries: 1
batchSize: 100
lingerMs: 5
bufferMemory: 33554432
requestTimeoutMs: 60

我尝试了许多组合(特别是 batchSizelingerMs),但没有任何效果。任何帮助请什么应该是上述场景的设置。

使用以下配置再次尝试...但没有运气同样的错误

acks = 1
    batch.size = 15
    buffer.memory = 33554432
    client.id = 
    compression.type = none
    connections.max.idle.ms = 540000
    enable.idempotence = false
    interceptor.classes = []
    key.serializer = class org.apache.kafka.common.serialization.StringSerializer
    linger.ms = 0
    max.block.ms = 60000
    max.in.flight.requests.per.connection = 5
    max.request.size = 1048576
    metadata.max.age.ms = 300000
    metric.reporters = []
    metrics.num.samples = 2
    metrics.recording.level = INFO
    metrics.sample.window.ms = 30000
    partitioner.class = class com.spgmi.ca.prescore.partition.CompanyInfoPartitioner
    receive.buffer.bytes = 32768
    reconnect.backoff.max.ms = 1000
    reconnect.backoff.ms = 50
    request.timeout.ms = 120
    retries = 1

第二次跑步:

我尝试了不同的组合,但没有任何效果。 因此我认为这将是网络,SSL等问题。 所以我在生产者运行的同一台机器上安装并运行 Kafka,即在我的本地计算机上。

我试图再次运行生产者指向本地 Kafka 主题。 但没有运气同样的问题。

以下是使用的配置参数。

2019-07-02 05:55:36.663  INFO 9224 --- [lt-dispatcher-2] o.a.k.clients.producer.ProducerConfig    : ProducerConfig values: 
    acks = 1
    batch.size = 0
    bootstrap.servers = [localhost:9092]
    request.timeout.ms = 60
    retries = 1
    buffer.memory = 33554432
    linger.ms = 0
    client.id = 
    compression.type = none
    connections.max.idle.ms = 540000
    enable.idempotence = false
    interceptor.classes = []
    max.block.ms = 60000
    max.in.flight.requests.per.connection = 5
    max.request.size = 1048576
    metadata.max.age.ms = 300000
    metric.reporters = []
    metrics.num.samples = 2
    metrics.recording.level = INFO
    metrics.sample.window.ms = 30000
    receive.buffer.bytes = 32768
    reconnect.backoff.max.ms = 1000
    reconnect.backoff.ms = 50
    retry.backoff.ms = 100
    sasl.client.callback.handler.class = null
    sasl.jaas.config = null
    sasl.kerberos.kinit.cmd = /usr/bin/kinit
    sasl.kerberos.min.time.before.relogin = 60000
    sasl.kerberos.service.name = null
    sasl.kerberos.ticket.renew.jitter = 0.05
    sasl.kerberos.ticket.renew.window.factor = 0.8
    sasl.login.callback.handler.class = null
    sasl.login.class = null
    sasl.login.refresh.buffer.seconds = 300
    sasl.login.refresh.min.period.seconds = 60
    sasl.login.refresh.window.factor = 0.8
    sasl.login.refresh.window.jitter = 0.05
    sasl.mechanism = GSSAPI
    security.protocol = PLAINTEXT
    send.buffer.bytes = 131072
    ssl.cipher.suites = null
    ssl.enabled.protocols = [TLSv1.2, TLSv1.1, TLSv1]
    ssl.endpoint.identification.algorithm = https
    ssl.key.password = null
    ssl.keymanager.algorithm = SunX509
    ssl.keystore.location = null
    ssl.keystore.password = null
    ssl.keystore.type = JKS
    ssl.protocol = TLS
    ssl.provider = null
    ssl.secure.random.implementation = null
    ssl.trustmanager.algorithm = PKIX
    ssl.truststore.location = null
    ssl.truststore.password = null
    ssl.truststore.type = JKS
    transaction.timeout.ms = 60000
    transactional.id = null

面临同样的错误: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for inbound_topic--1: 69 ms has been given since batch creation plus linger time

也试过了 批量大小 5、10 和 0 linger_ms 0 , 5 , 10 等 request_time_out 0 , 45, 60, 120 , 300 等

没有任何效果...同样的错误。

我还应该尝试什么,有什么解决方案?

如何避免生成负密钥

是的,我设置了本地设置并打印带有分区信息的日志,如下所示

2019-07-03 02:48:28.822 INFO 7092 --- [lt-dispatcher-2] c.s.c.p.p.CompanyInfoPartitioner:主题:inbound_topic Key = 597736248- Entropy Cayman Solar Ltd.-null-null-null 分区= -1 2019-07-03 02:48:28.931 错误 7092 --- [广告 | producer-1] o.s.k.support.LoggingProducerListener:发送消息时引发异常,其中 key='597736248- Entropy Cayman Solar Ltd.-null-null-null' 和 payload='com.spgmi.ca.prescore.model.Company@8b12343 ' 到主题 inbound_topic :

org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for inbound_topic --1: 104 ms has been given since batch creation plus linger time

我的主题 inbound_topic 有两个分区,如下所示 C:\Software\kafka\kafka_2.11-2.1.1\bin\windows>kafka-topics.bat --describe --zookeeper localhost:2181 --topic inbound_topic 主题:inbound_topic PartitionCount:2 ReplicationFactor:1 配置: 主题:inbound_topic 分区:0 领导者:0 副本:0 Isr:0 主题:inbound_topic 分区:1 个领导者:0 个副本:0 个 Isr:0

但我的制作人似乎试图发送到 Partition = -1。

我的分区逻辑如下

int p = (((String)key).hashCode() * Integer.MAX_VALUE) % numPartitions;
        logger.info("Topic : "+ topic + "\t Key = " + (String)key + " Partition = " + p );

我正在做 hashCode()。这里需要更正什么以避免这个负数分区号?即分区 = -1

我的分区键逻辑应该是什么样的?

高度赞赏的任何帮助。

【问题讨论】:

    标签: apache-kafka kafka-producer-api spring-kafka


    【解决方案1】:

    错误表明某些记录被放入队列的速度比它们从客户端发送的速度要快。

    当您的 Producer 发送消息时,它们会存储在缓冲区中(在将它们发送到目标代理之前),并且将记录分组在一起以增加吞吐量。将新记录添加到批次时,必须在由request.timeout.ms 控制的可配置时间窗口内发送(默认设置为 30 秒)。如果批次在队列中的时间较长,则会抛出TimeoutException,然后批次记录将从队列中删除,并且不会传递给代理。

    增加request.timeout.ms 的值应该可以解决问题。


    如果这不起作用,您还可以尝试减少 batch.size 以便更频繁地发送批次(但这次将包含更少的消息)并确保将 linger.ms 设置为 0(这是默认值)值)。

    请注意,更改任何配置参数后,您需要重新启动您的 kafka 代理。

    如果您仍然收到错误消息,我认为您的网络出现问题。您启用 SSL 了吗?

    【讨论】:

    • 非常感谢您的详细解释。我之前尝试过 request.timeout.ms 120 并增加了 request.timeout.ms 120 但没有用。现在我按照您的建议尝试了 linger.ms = 0 但仍然出现相同的错误......我更新了问题。
    • 为什么我们要在更改任何配置参数后重新启动您的 kafka brokers,在 Producer config 中设置了参数,更改它们将如何影响 Brokers 配置重新启动它们?真的很困惑,你能不能多放点光?
    • @Shyam 我说的是代理级别的配置参数(即server.properties 中的那些)。
    【解决方案2】:

    我通过返回一个有效的分区号解决了之前的问题。

    【讨论】:

    • 是的,对于其他有同样问题的人。我到处搜索,很多对request.timeout.msbatch.sizelinger.ms 等的引用都没有找到。问题是负分区号。
    • 你能解释一下吗
    • @Satya Pavan 有时我仍然会遇到这个问题......但为了找出解决方案,我调整了一些东西但没有得到解决。
    • 您是否尝试过在 kafka 端更新广告主机侦听器?
    • @Satya Pavan 试过了,kafka 集群也被其他人使用了......他们没有任何问题。
    猜你喜欢
    • 2018-09-30
    • 2018-03-20
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2017-10-16
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多