我正在阅读Kafka:The Definitive Guide,并希望更好地了解重新平衡监听器。本书中的示例simple使用HashMap
来维护已处理的当前偏移量,并在撤销分区时提交当前状态。我担心的是:
我对代码示例有两个问题/问题:
答案 0 :(得分:4)
我重读了书中的部分,我同意我也有点困惑!
Javadoc州:
此回调只会在用户线程中执行,作为其中的一部分 每当分区分配改变时,轮询(长)调用。
我查看了代码,并确认重新平衡侦听器方法确实在拥有Consumer的同一个线程中调用。
是的,在提交rebalance侦听器时应该使用commitSync()
。
为了解释原因,让我们看一下黄金道路的例子。我们从一位消费者开始,定期向协调员开心地消费和心跳。在某些时候,协调器会向心跳请求返回REBALANCE_IN_PROGRESS
错误。这可能是由于想要加入组的新成员,成员离开或未成功心跳,或者从订阅中添加/删除新分区引起的。此时,所有消费者都需要重新加入该组。
在尝试重新加入组之前,使用者将同步执行ConsumerRebalanceListener.onPartitionsRevoked()
。一旦监听器返回,消费者将向协调器发送JoinRequest以重新加入该组。
那就是说,我认为这就是你在考虑的问题,如果你的回调需要太长时间(> session.timeout.ms
)来提交,那么这个组可能已经在另一代了,并且分区有偏移尝试被转交给另一个成员。在这种情况下,即使它是同步的,提交也会失败。但是,通过在侦听器中使用commitSync()
,可以保证在完成提交之前,使用者不会重新加入该组。