卡夫卡重新平衡和听众陷阱

时间:2018-04-11 17:58:22

标签: apache-kafka rebalancing

我正在阅读Kafka:The Definitive Guide,并希望更好地了解重新平衡监听器。本书中的示例simple使用HashMap来维护已处理的当前偏移量,并在撤销分区时提交当前状态。我担心的是:

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

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

1 个答案:

答案 0 :(得分:4)

  1. 我重读了书中的部分,我同意我也有点困惑!

    Javadoc州:

      

    此回调只会在用户线程中执行,作为其中的一部分   每当分区分配改变时,轮询(长)调用。

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

  2. 是的,在提交rebalance侦听器时应该使用commitSync()

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

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

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