Kafka Rebalancing 和 listeners 陷阱

Kafka Rebalancing and listeners pitfalls

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

我有两个issues/questions代码示例:

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

    Javadoc 状态:

    This callback will only execute in the user thread as part of the poll(long) call whenever partition assignment changes.

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

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

    为了解释原因,让我们看一下黄金路径示例。我们从一个消费者愉快地消费并定期向协调者发出心跳开始。在某些时候,协调器 returns 心跳请求出现 REBALANCE_IN_PROGRESS 错误。这可能是由于新成员想要加入该组、成员离开或心跳失败,或者新分区来自订阅 added/removed。此时需要所有消费者重新加入群组。

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

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