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,以优化批次和压缩的使用.这将减少网络中的洪水并在您使用时优化压缩.
关于这类问题没有确切的答案,因为它们也取决于实施,在我的案例中,试验上述值有所帮助.
我们也遇到过类似的问题。许多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 秒后断开传出连接。
小智 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。
我希望它能有所帮助
| 归档时间: |
|
| 查看次数: |
6454 次 |
| 最近记录: |