使用Apache Kafka Java client (0.9),我尝试使用Kafka Producer class向代理发送一长串记录。
异步send method会立即返回一段时间,然后在短时间内开始阻塞每个调用。大约30秒后,客户端开始抛出异常(TimeoutException),并显示消息"Batch expired“。
在什么情况下会引发此异常?
发布于 2016-02-13 07:38:20
我在一个完全不同的上下文中得到了这个异常。
我设置了一个由zookeeper vm、broker vm和producer/consumer vm组成的迷你集群。我打开了服务器(9092)和zookeeper (2181)上的所有必要端口,然后尝试将来自消费者/发布者vm的消息发布到代理。我得到了OP提到的异常,但由于到目前为止我只发布了一条消息(或者至少我尝试过),解决方案不可能是增加超时或批处理大小。因此,我搜索并找到了这个邮件列表,它描述了我在尝试使用来自消费者/生产者vm (ClosedChannelException)的消息时遇到的类似问题:http://grokbase.com/t/kafka/users/152jsjekrm/having-trouble-with-the-simplest-remote-kafka-config,这个邮件列表中的最后一篇文章实际上描述了如何解决这个问题。
长话短说,如果同时遇到ChannelClosedException
和Batch Expired
异常,则可能需要在server.config
文件中将此行更改为以下内容,然后重新启动代理:
advertised.host.name=<broker public IP address>
如果没有设置,它将回退到host.name
属性(可能也没有设置),然后回退到InetAddress
Java类的规范主机名,当然,这最终是不正确的,从而使远程节点感到困惑。
发布于 2016-01-22 04:12:08
控制发送到broker之前的时间的参数是linger.ms
。默认值为0(无延迟)。
发布于 2017-10-05 17:41:03
我使用的是Kafka Java客户端0.11.0.0版。我也开始看到同样的模式,无法始终如一地生成大型消息。它传递的消息很少,还有一些消息失败了。(虽然通过的消息和失败的消息大小相同).In我的情况是,每个消息的大小都在60KB左右,这远远高于Kafka的默认batch.size
16kB,而且我的linger.ms
也设置为默认值0。这个错误被抛出,因为生产者客户端在它可以从server.Basically接收到成功响应之前超时,在我的代码中,此调用超时:kafkaProd.send(pr).get()
。要解决这个问题,我必须将生产者客户机的默认request.timeout.ms
增加到60000
https://stackoverflow.com/questions/34794260
复制相似问题