使用Apache Kafka Java客户端(0.9),我正在尝试使用Kafka Producer class向代理发送一长串记录。
异步send method会立即返回一段时间,然后在短时间内开始阻止每次通话。大约三十秒后,客户端开始抛出异常(TimeoutException),消息“批处理已过期”。
什么情况会导致抛出此异常?
答案 0 :(得分:46)
此异常表示您以比发送速度更快的速度对记录进行排队。
当您调用send方法时,ProducerRecord将存储在内部缓冲区中以便发送给代理。一旦ProducerRecord被缓冲,该方法立即返回,无论它是否已被发送。
记录分组为批次,用于发送给代理,减少每封邮件的传输,并提高吞吐量。
一旦添加了一个批处理记录,发送该批处理有一个时间限制,以确保它在指定的持续时间内发送。这由Producer配置参数request.timeout.ms控制,默认为30秒。
如果批处理的排队时间超过了超时限制,则会抛出异常。该批次中的记录将从发送队列中删除。
使用配置参数增加超时限制将允许客户端在到期前将批次排队更长时间。
答案 1 :(得分:31)
我在一个完全不同的背景下得到了这个例外。
我已经建立了一个由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 此邮件列表中的最后一篇文章实际上描述了如何解决问题。
简而言之,如果您同时遇到ChannelClosedException
和Batch Expired
异常,则可能需要在server.config
文件中将此行更改为以下内容并重新启动代理:< / p>
advertised.host.name=<broker public IP address>
如果没有设置,它会回退到host.name
属性(可能既不设置),然后又回退到InetAddress
的规范主机名Java类,当然最终并不正确,因而使远程节点混乱。
答案 2 :(得分:3)
在发送到代理之前控制时间的参数是linger.ms
。其默认值为0(无延迟)。
答案 3 :(得分:2)
我使用的是Kafka Java客户端版本0.11.0.0。我也开始看到相同的模式未能始终如一地生成大型消息。它传递了一些消息,而其他一些消息则失败了。 (虽然通过和失败的消息大小相同)。在我的情况下,每个消息大小约为60KB,远远高于Kafka的默认batch.size
16kB,也是我的{{1}设置为默认值为0.由于生产者客户端在从服务器收到成功响应之前超时,因此抛出此错误。基本上,在我的代码中,此调用超时:linger.ms
。要解决此问题,我必须将Producer客户端的默认kafkaProd.send(pr).get()
增加到60000
答案 4 :(得分:1)
Kafka在docker-compose中运行时遇到了类似的问题。 我的docker-compose.yml设置为
KAFKA_ADVERTISED_HOST_NAME: kafka
ports:
- 9092:9092
但是当我尝试从户外码头发送带有骆驼的消息时
to("kafka:test?brokers=localhost:9092")
我遇到了TimeoutException。我通过添加
解决了这个问题127.0.0.1 kafka
到Windows \ System32 \ drivers \ etc \ hosts文件,然后将我的骆驼网址更改为
to("kafka:test?brokers=kafka:9092")
答案 5 :(得分:0)
我解决了。
我的Kafka部署在Docker容器中,并且容器的网络模式是网桥,主机和容器使用端口映射,并且我将Kafka服务器的默认端口更改为9102。
server.properties中用于解决此问题的配置项是以下两个: 听众 advertised.listeners
我尝试了几种组合:
成功:
import cv2
im = cv2.imread('1742.jpg')
blur = cv2.GaussianBlur(im, (5, 5), 0)
edged = cv2.Canny(blur, 0, 150)
contours, _ = cv2.findContours(edged, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(im, contours, -1, (0,255,0), 3)
cv2.imshow('Final Image with Contours', im)
cv2.waitKey()
服务器无法启动:
listeners=PLAINTEXT://:9102
advertised.listeners=PLAINTEXT://192.168.0.136:9102
超时错误:
listeners=PLAINTEXT://192.168.0.136:9102
advertised.listeners=PLAINTEXT://192.168.0.136:9102
答案 6 :(得分:-4)
当您将消费者集ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG创建为true时。