Kafka Producer NetworkException和Timeout Exceptions

Sha*_*s88 13 java apache-kafka

我们随机NetworkExceptions而且TimeoutExceptions在我们的生产环境中:

Brokers: 3
Zookeepers: 3
Servers: 3
Kafka: 0.10.0.1
Zookeeeper: 3.4.3
Run Code Online (Sandbox Code Playgroud)

我们偶尔会在生产者日志中获得此异常:

超过TOPIC的10条记录:XXXXXX:自创建批次以及延迟时间后已经过了5608 ms.

此类错误消息中的毫秒数不断变化.有时它的〜5秒其他时间长达~13秒!

我们很少得到:

NetworkException: Server disconnected before response received. 
Run Code Online (Sandbox Code Playgroud)

集群由3名 经纪人3名 动物园管理员组成.生产者服务器和Kafka集群在同一网络中.

我正在进行同步通话.有一个Web服务,多个用户请求调用它来发送数据.Kafka Web服务有一个Producer对象,它执行所有发送.生产者的请求超时最初为1000毫秒,已更改为15000毫秒(15秒).即使在增加超时期限后TimeoutExceptions仍会出现错误日志.

可能是什么原因?

Pai*_*izo 15

找到根本原因有点棘手,我会放弃我的经验,希望有人可能会发现它有用.一般来说,它可能是一个网络问题或太多的网络洪水与ack=ALL.这里说的解释图TimeoutException卡夫卡KIP-91在他写作(仍然适用直到1.1.0)的时间:

在此输入图像描述

排除网络配置问题或错误,这是您可以根据您的方案调整的属性,以便缓解或解决问题:

  • 所述buffer.memory控制提供给用于缓冲的生产者的总存储器.如果记录的发送速度快于传输到Kafka的速度,那么这个缓冲区将被超过,然后额外的发送调用阻塞到max.block.ms,之后Producer抛出一个TimeoutException.

  • max.block.ms早已很高的价值,我不建议进一步增加它.buffer.memory的默认值为32MB,根据您的邮件大小,您可能希望增加它; 如果需要,增加jvm堆空间.

  • 重试次数定义在放弃之前发生错误时重新发送记录的次数.如果您使用零重试,您可以尝试通过增加此值来缓解此问题,请注意记录顺序不再保证,除非您将max.in.flight.requests.per.connection设置为1.

  • 一旦达到批量大小或通过了延迟时间,就会发送记录,以先到者为准.如果batch.size(默认16kb)小于最大请求大小,您可能应该使用更高的值.此外,将linger.ms更改为更高的值,例如10,50或100,以优化批次和压缩的使用.这将减少网络中的洪水并在您使用时优化压缩.

关于这类问题没有确切的答案,因为它们也取决于实施,在我的案例中,试验上述值有所帮助.


mma*_*mat 8

我们也遇到过类似的问题。许多NetworkExceptions在日志和不时TimeoutException

原因

一旦我们从生产中收集 TCP 日志,结果证明,在闲置 5 分钟(FINTCP 层上没有标志)后,一些与 Kafka 代理(我们有 3 个代理节点)的 TCP 连接在没有通知客户端的情况下被删除。当客户端在此之后尝试重新使用此连接时,RST返回标志。我们可以轻松地将 TCP 日志中的这些连接重置与NetworkExceptions应用程序日志中的这些连接重置进行匹配。

至于TimeoutException,我们无法进行与找到原因时相同的匹配,这种类型的错误不再发生。但是,我们在单独的测试中确认,丢弃 TCP 连接也可能导致TimeoutException. 我想这是因为 Java Kafka Client 在底层使用 Java NIO Socket Channel。所有消息都被缓冲,然后在连接准备好后分派。如果连接在超时(30 秒)内未准备好,则消息将过期,导致TimeoutException.

解决方案

对我们来说,解决方法是将我们客户端的connection.max.idle.ms减少到 4 分钟。一旦我们应用它,NetworkExceptions就从我们的日志中消失了。

我们仍在调查断开连接的原因。

编辑

问题的原因是 AWS NAT 网关在 350 秒后断开传出连接。

https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-troubleshooting.html#nat-gateway-troubleshooting-timeout


小智 0

解决方案1

调整

listeners=PLAINTEXT://hostname:9092
Run Code Online (Sandbox Code Playgroud)

server.properties 文件中的属性

listeners=PLAINTEXT://0.0.0.0:9092
Run Code Online (Sandbox Code Playgroud)

解决方案2

将broker.id更改为1001等值,通过设置环境变量更改broker id KAFKA_BROKER_ID

您必须将环境变量设置KAFKA_RESERVED_BROKER_MAX_ID为 1001 之类的值,才能将代理 ID 设置为 1001。

我希望它能有所帮助