首页 文章

Kafka Producer NetworkException和Timeout Exceptions

提问于
浏览
10

我们在 生产环境 环境中随机 NetworkExceptionsTimeoutExceptions

Brokers: 3
Zookeepers: 3
Servers: 3
Kafka: 0.10.0.1
Zookeeeper: 3.4.3

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

过期10个TOPIC记录:XXXXXX:自批量创建加上延迟时间后已经过了5608毫秒 .

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

我们很少得到:

NetworkException: Server disconnected before response received.

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

我正在进行同步通话 . 有's a web service to which multiple user requests call to send their data. Kafka web service has one Producer object which does all the sending. Producer' s请求超时最初为1000毫秒,已更改为15000毫秒(15秒) . 即使在增加超时期限后, TimeoutExceptions 仍会出现在错误日志中 .

可能是什么原因?

3 回答

  • 0

    找到根本原因有点棘手,我会放弃我的经验,希望有人可能会发现它有用 . 通常,它可能是网络问题或与 ack=ALL 结合使用的网络泛滥太多 . 这里有一个图表,在撰写本文时从Kafka KIP-91解释 TimeoutException (仍然适用于1.1.0):

    enter image description here

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

    • buffer.memory 控制 生产环境 者可用于缓冲的总内存 . 如果记录的发送速度快于传输到Kafka的速度,那么此缓冲区将被超过,然后额外的发送调用将阻塞到 max.block.ms ,然后 生产环境 者抛出 TimeoutException .

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

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

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

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

  • 7

    Solution 1

    修改

    listeners=PLAINTEXT://hostname:9092
    

    server.properties文件中的属性

    listeners=PLAINTEXT://0.0.0.0:9092
    

    Solution 2

    将broker.id更改为类似1001的值,通过设置环境变量 KAFKA_BROKER_ID 来更改brocker id .

    您必须将环境变量 KAFKA_RESERVED_BROKER_MAX_ID 设置为类似于1001,以允许将代理ID设置为1001 .

    我希望它可以提供帮助

  • 0

    增加制作人的 request.timeout.msretries

相关问题