卡夫卡消费者意外重新平衡

时间:2017-12-09 23:22:48

标签: java multithreading apache-kafka kafka-consumer-api

我们在Java Kafka消费者中看到了意外的重新平衡,如下所述。这些问题对任何人来说都很熟悉吗?有关API或调试技术的任何提示,以找出重新平衡的原因吗?

  1. 两个进程正在阅读主题。有时,主题上的所有分区都会重新平衡到单个读取器进程。重启两个进程后,分区均衡均衡。

  2. 两个进程正在阅读主题。有时,一系列重新平衡会使读者之间的分区反弹。我们称消费者暂停/恢复背压,这可以防止这种情况。

  3. 两个进程正在阅读主题。有时,当两个进程看起来都正常时,会发生重新平衡。之后,阅读工作正常,但这是处理过程中的一个小问题。

  4. 我们希望分区在没有看到某些原因或失败的情况下不会重新平衡。

    有时poll()卡住(超过超时),我们使用wakeup()close(),然后创建新的消费者。有时协调员心跳线程在消费者关闭后继续运行(我们已经看到了数千个)。时间似乎与重新平衡无关,因此重新平衡似乎是一个单独的问题,但也许心跳正在打击一个未记录的网络问题。

    我们使用ConsumerRebalanceListener来记录和处理某些重新平衡,但Kafka API似乎没有公开有关重新平衡原因的数据。

    重新平衡是间歇性的,难以重现。它们以每秒10,000到80,000的消息速率发生。我们在日志中看不到明显的错误。

    我们的读取循环非常简单 - 基本上是#34;在运行时,使用超时和错误处理轮询,然后将收到的消息排入队列"。

    人们已经提出了相关的问题,但答案并没有帮助我们:

    配置:

    1. Kafka 0.10.1.0(我们已经开始尝试1.0.0&还没有测试结果)
    2. Java 8经纪人和客户
    3. 2个经纪人,1个动物园管理员,稳定的运行流程&没有补充
    4. 5个主题,有2个有点繁忙的主题。重新平衡发生在一个繁忙的(主题" A")。
    5. 主题A有16个分区和复制2,并在消费者开始之前创建。
    6. 一个进程写入主题A;从主题A中读取的两个过程。
    7. 每个读者进程运行16个消费者。当16个分区均衡平衡时,一些消费者处于空闲状态。
    8. 消费者线程在民意调查之间做的很少。消息处理在与消费者不同的线程上异步发生。
    9. 主题A的所有消费者都在同一个消费者群体中。
    10. KafkaConsumer.poll()的超时时间为1000毫秒。
    11. 影响重新平衡的配置是:

      1. max.poll.interval.ms=50000
      2. max.poll.records=100
      3. request.timeout.ms=40000
      4. session.timeout.ms=20000

        我们使用默认值:

      5. heartbeat.interval.ms=3000
      6. (经纪人)group.max.session.timeout.ms=300000
      7. (经纪人)group.min.session.timeout.ms=6000

1 个答案:

答案 0 :(得分:0)

检查gc日志,并确保不经常有完整的gc,这将阻止心跳线程正常工作。