如何解决kafka.common.errors.TimeoutException:自批处理创建开始,经过1秒钟的xxx毫秒到期记录

时间:2019-06-28 12:43:07

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

我正在使用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:inbound_topic--1的1条记录已过期:自创建批处理以来,已经过去了69毫秒时间

也尝试过 批量大小5,10&0 linger_ms 0,5,10等 request_time_out 0,45,60,120,300等。

什么都没有...相同的错误。

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

如何避免产生否定键

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

2019-07-03 02:48:28.822信息7092 --- [lt-dispatcher-2] cscppCompanyInfoPartitioner:主题:inbound_topic键= 597736248-熵Cayman Solar Ltd.-null-null-null 分区= -1 2019-07-03 02:48:28.931错误7092 --- [广告| producer-1] osksupport.LoggingProducerListener:发送带有key ='597736248- Entropy Cayman Solar Ltd.-null-null-null'和payload='com.spgmi.ca.prescore.model.Company@8b12的消息时,引发异常'到主题inbound_topic:

org.apache.kafka.common.errors.TimeoutException:inbound_topic --1的1条记录已过期:自批处理创建以来已经过了104毫秒,并且还有较长的时间

我的主题inbound_topic有两个分区,如下所示 C:\ Software \ kafka \ kafka_2.11-2.1.1 \ bin \ windows> kafka-topics.bat-描述--zookeeper本地主机:2181 --topic inbound_topic 主题:inbound_topic分区数:2复制因素: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()。为了避免此负数分区号,需要在此处更正什么?即Partition = -1

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

高度重视的任何帮助。

2 个答案:

答案 0 :(得分:1)

该错误表明某些记录以比从客户端发送记录更快的速度放入队列。

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

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

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

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

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

答案 1 :(得分:0)

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