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

ade*_*dev 7 java multithreading apache-kafka kafka-consumer-api

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

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

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

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

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

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

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

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

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

人们提出了很好的相关问题,但答案对我们没有帮助:

组态:

  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

小智 0

检查gc日志,确保没有频繁的full gc,这会阻止心跳线程工作。