Apache Kafka客户端何时抛出“Batch Expired”异常?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (564)

使用Apache Kafka Java客户端(0.9),我试图使用Kafka Producer类向代理发送很长的一系列记录。

异步发送方法会立即返回一段时间,然后在短时间内开始阻止每个呼叫。大约三十秒后,客户端开始抛出异常(TimeoutException),并显示消息“Batch expired”

什么情况会导致此异常被抛出?

提问于
用户回答回答于

此例外表明正在以比它们可以发送更快的速度对记录进行排队。

当调用send方法时,ProducerRecord将被存储在内部缓冲区中以发送给代理。无论是否发送ProducerRecord,该方法都会立即返回。

记录被分组成批以发送给代理,以减少每个消息被窃听的传输并提高吞吐量。

一旦记录添加了一个批次,发送该批次的时间限制就会确保它在指定的时间内发送。这由Producer配置参数request.timeout.ms控制,默认为30秒。

如果该批次排队超过超时限制,则会抛出异常。该批次中的记录将从发送队列中删除。

使用配置参数增加超时限制将允许客户端在到期之前将批次排队更长时间。

用户回答回答于

我在完全不同的情况下得到了这个异常。

我已经建立了一个zookeeper vm,一个经纪人vm和一个生产者/消费者vm的迷你集群。我打开了服务器(9092)和zookeeper(2181)上的所有必要端口,然后尝试从消费者/发布者vm向代理发布消息。我得到了OP提到的异常,但由于我迄今为止只发布了一条消息(或者至少我尝试过),所以解决方案不能增加超时或批量大小。所以我搜索了一下,发现这个邮件列表描述了我在尝试从消费者/生产者vm(ClosedChannelException)中使用消息时遇到的类似问题:http : //grokbase.com/t/kafka/users/152jsjekrm/having-trouble -with-the-simplest-remote-kafka-config 这个邮件列表中的最后一篇文章实际上描述了如何解决这个问题。

如果你同时面对ChannelClosedExceptionBatch Expired异常,你可能必须将这一行更改为server.config文件中的以下内容并重新启动broker:

advertised.host.name=<broker public IP address>

如果没有设置,它会回落到host.name属性(可能没有设置),然后回退到InetAddressJava类的规范主机名,当然这最终不正确,从而导致远程节点混淆。

扫码关注云+社区

领取腾讯云代金券