将消息发送到Kafka主题时发生timeoutException

时间:2019-05-27 13:38:15

标签: apache-kafka kafka-producer-api

我无法生成有关Kafka主题的消息。

向Kafka主题生成一些消息时,它会间歇性地失败,并出现以下异常:

  

org.apache.kafka.common.errors.TimeoutException:某些主题1的6条记录已过期:自批处理创建以来已经过去了30056 ms

问题似乎与我在这里已经发现的其他问题有所不同。它发生在负载很低的情况下。我很确定我不会超过缓冲区大小(默认值)。 linger.ms设置设为0(默认)。 request.timeout.ms也被设置为默认值30000。

实际上,我的问题是:在调用send()方法与实际发送方法之间,是否有什么可以保持发送kafka消息过程30秒的?我正在寻找可以使ProducerBatch在非常低的负载(或没有任何负载)下超过30秒的生存时间的任何东西。

我使用外部提供商提供的Kafka托管服务,所以我问了他经纪人的身份,他说一切都很好。顺便说一句,它发生在三个不同的Kafka实例上。 Kafka Client版本也无关紧要-0.11.0.0和2.0.1都在发生。

1 个答案:

答案 0 :(得分:0)

我刚刚查看了Kafka documentation for version 2.0.X,我想说的是由于默认设置和较低的邮件提取负载而导致您遇到此错误。

让我们尝试剖析您的错误消息:

  

org.apache.kafka.common.errors.TimeoutException:到期6条记录   对于some-topic-1:自创建批处理以来已经过去了30056 ms   时间

  1. 错误的第一个线索是 30056毫秒已过去 -配置request.timeout.ms在这里显示。此配置的默认值为30000,即30秒。这30秒的等待是为了填补生产者一方的缓冲区-我已在下一点中对此进行了解释。
  2. 错误消息中的第二条提示是 自批量创建起 -当您调用send()方法时-消息在生产者端被缓冲,它将等待持续30秒(由第一个config属性指示)以填充批次。现在,batch.size的默认值为16384字节,即16 KB,因此,如果消息接收负载较低(如您的情况),并且缓冲区中没有更多的消息填充到16 30秒内完成KB-您可能会收到此错误消息。因此,在您的情况下, 即将到期的6条记录 似乎并没有真正组成填充批处理所需的16 KB。
  3. 最后,该错误还提到了 加上停留时间 -这是linger.ms的配置,它发现它在摄取量很高,并且制作人希望将对send()的调用限制到Kafka经纪人。这是在批处理就绪(即缓冲区已填满batch.size)之后,生产者在将消息发送给代理之前等待的持续时间。默认值是0,因此在您的情况下,生产者将在批处理准备就绪后等待0毫秒。但是您的缓冲区实际上并没有在给定的时间内填满。

现在,要回答您的问题:您可以增加linger.ms,以便在批处理准备就绪后可以保留更长的消息。如果您需要更多时间来填充批次,则需要增加request.timeout.ms。您不妨同时尝试两者。

在类似的行上,要解决此错误,您可以增加request.timeout.ms或减少batch.size,或者两者都可以。

希望这会有所帮助!