当前位置: 首页 > 知识库问答 >
问题:

Apache Kafka客户端何时抛出"批量过期"异常?

毛峻
2023-03-14

使用Apache KafkaJava客户端(0.9),我试图使用Kafka Producer类向代理发送一长串记录。

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

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

共有3个答案

阚元白
2023-03-14

控制发送到代理之前的时间的参数是linger.ms。它的默认值是0(无延迟)。

终彬郁
2023-03-14

我在一个完全不同的背景下得到了这个例外。

我已经设置了一个由zookeeper虚拟机、代理虚拟机和生产者/消费者虚拟机组成的小型集群。我打开了服务器(9092)和zookeeper(2181)上所有必要的端口,然后尝试将来自消费者/发行者vm的消息发布到代理。我得到了OP提到的异常,但由于到目前为止我只发布了一条消息(或者至少我试过发布),解决方案不能是增加超时或批处理大小。所以我继续搜索,发现了这个邮件列表,它描述了我在尝试从consumer/producer vm(ClosedChannel例外)中使用邮件时遇到的类似问题:http://grokbase.com/t/kafka/users/152jsjekrm/having-trouble-with-the-simplest-remote-kafka-config这个邮件列表中的最后一篇文章实际上描述了如何解决这个问题。

长话短说,如果您同时面对ChannelClosedExctive和Batch Expired异常,您可能必须将这行更改为server.config文件中的以下内容并重新启动代理:

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

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

袁泰平
2023-03-14

此异常表示您正在以比发送速度更快的速度对记录进行排队。

调用send方法时,ProducerRecord将存储在内部缓冲区中,以便发送到代理。该方法在缓冲ProducerRecord后立即返回,无论它是否已发送。

记录被分组成批次发送给代理,以减少每条消息的传输无意中听到并提高吞吐量。

一旦记录被添加为批处理,发送该批处理有一个时间限制,以确保它在指定的持续时间内被发送。这由生产者配置参数request.timeout.ms控制,默认为30秒。

如果批处理的排队时间超过超时限制,将引发异常。该批处理中的记录将从发送队列中删除。

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

 类似资料:
  • 问题内容: 使用Apache Kafka Java客户端(0.9),我试图使用Kafka Producer类 将一连串的记录发送到代理。 异步发送方法会立即返回一会儿,然后在很短的时间内开始阻塞每个调用。大约三十秒钟后,客户端开始引发异常(TimeoutException),并显示消息 “批处理已过期” 。 在什么情况下会引发此异常? 问题答案: 此异常表示您正在以比发送记录更快的速率对记录进行排

  • 我需要多次调用服务(>50次)并聚合响应。因此,我决定使用,使用Async和CustomExecuter(它自己的线程池)来提高速度,而不是等待服务响应。 我在类路径上使用带有ApacheHTTP和Hystrix的feign客户机。我可以看到它有时是工作的,有时我得到例外,因为电路是开放的。

  • 我正在寻找一个JMX客户端,它可以从批处理文件中调用mbean操作。实际上,cron作业应该通过Weblogic服务器中的JMX调用操作。 不幸的是,VisualVM在批处理模式下无法工作(或者它可以吗?)。 那么,您使用什么作为JmX批处理客户端? 有人试过吗http://wiki.cyclopsgroup.org/jmxterm ? 我找不到它的驾照 什么是最好的或最常用的JMX控制台/客户端

  • 我正在使用具有以下配置的Redisson连接到哨兵服务器:

  • 我在其中一个POJO中使用javax.validation.constraints.NotNull,如下所示: 然后,即使我为两个字段都使用 null 值制作 Abc 的对象,它也不会引发任何异常。知道为什么吗? 例如。 不会抛出任何异常。

  • 我们已经实现了Kerberos java客户端,它运行良好。然而,当kerberos票证过期时,Java客户端应用程序会在控制台中请求用户名,这反过来会使应用程序挂起。在SoapUI等工具中,我们观察到当Kerberos票证过期时,系统抛出未经授权的错误。我们希望实现类似的行为,即如果Kerberos票证过期,则应抛出未经授权的错误,而不是等待用户输入凭据。请帮忙。 为Kerberos测试设置客户