【问题标题】:Kafka Rebalancing and listeners pitfalls卡夫卡再平衡和听众陷阱
【发布时间】:2018-04-11 17:58:22
【问题描述】:

我正在阅读 Kafka:权威指南,并希望更好地了解重新平衡侦听器。简单书中的示例使用HashMap 来维护当前已处理的偏移量,并将在撤销分区时提交当前状态。我的担忧是:

我对代码示例有两个问题/疑问:

  1. 使用的语言让我假设这些回调是在不同的线程上进行的。那么,在应用当前偏移量时不应该考虑线程安全吗?另外,提交后不应该取消当前批次吗?
  2. 它说使用 commitSync 来确保在重新平衡进行之前提交偏移量。但是,这仅在该消费者中是同步的。是否有某种机制使协调器在收到所有订阅消费者的回复后才会继续?

【问题讨论】:

    标签: apache-kafka rebalancing


    【解决方案1】:
    1. 我重新阅读了书中的部分,我同意我也有点困惑!

      Javadoc 声明:

      此回调将仅在用户线程中作为 每当分区分配发生变化时调用 poll(long)。

      我查看了代码并确认重新平衡侦听器方法确实在拥有消费者的同一线程中调用。

    2. 是的,在重新平衡侦听器中提交时,您应该使用commitSync()

      为了解释原因,让我们看一下黄金路径示例。我们从消费者愉快地消费开始,并定期向协调器发送心跳。在某些时候,协调器会向心跳请求返回REBALANCE_IN_PROGRESS 错误。这可能是由想要加入组的新成员、成员离开或心跳失败或从订阅中添加/删除新分区引起的。此时,所有消费者都需要重新加入群组。

      在尝试重新加入组之前,消费者将同步执行ConsumerRebalanceListener.onPartitionsRevoked()。监听器返回后,消费者将向协调器发送 JoinRequest 以重新加入组。

      也就是说,我认为这就是您所考虑的,如果您的回调需要太长时间 (> session.timeout.ms) 才能提交,则该组可能已经在另一代中,并且具有偏移量的分区正在尝试提交分配给另一个成员。在这种情况下,即使是同步的,提交也会失败。但是通过在侦听器中使用commitSync(),可以保证消费者在完成提交之前不会重新加入组。

    【讨论】:

    • 因此,为了完全澄清,在集群已经重新分区之后发生的commitSync 将导致代理拒绝它。那将是一个不可重试的事件,消费者可以按照您认为合适的方式处理它吗?
    • 在这种情况下,提交将失败(失败时调用提交回调),消费者只会尝试重新加入组。分配了无法提交的分区的组成员将从上次成功提交的偏移量重新启动
    • @MickaelMaison 您在答案中的第一点是否意味着,消费者重新平衡侦听器只会在再次调用 poll 时执行,因为在那种情况下,书中的示例没有意义,因为偏移量将在处理记录时已提交,无需在重新平衡侦听器中再次提交。
    • @MickaelMaison 书中的例子,只有在后台运行的心跳线程有办法中断处理线程并将控制权恢复到 poll() 时才有意义,就像goto 会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2022-08-08
    • 2019-05-08
    相关资源
    最近更新 更多