消费者不知道分区撤销

时间:2019-06-14 17:28:35

标签: apache-kafka kafka-consumer-api

主题名称:testTopic 主题中的消息总数:1 分区:8 消费者组名称:Consumer1
消费者语言:带有分区侦听器的Java 基础架构:具有4个并行运行的jvm(这意味着4个使用者以相同的组名运行)

问题:当我启动我的第一个使用者Lister时,调用了回调方法并完成了分区分配..该使用者开始处理我的消息。

举个例子,这个使用者持有一条消息MSG-1,而我的处理器正在处理该消息(我故意将20毫秒作为线程等待时间)。因此,没有将MSG-1提交给具有偏移的主题。

消费者的

属性 session.timeout.ms = 15毫秒。

与此同时,消费者2开始了,

此使用者启动了分配的分区(调用了正确的回调方法),并且没有使用消息,因为这两个消息由使用者1保留。

现在,从消费者心跳间隔开始,经纪人认为消费者1已死,并重新分配了消费者2(全部)的分区 现在回调在Consumer-2处调用的方法(已分配并吊销)。同时,我的会话超时已到期,msg-1和msg-2回到主题并选择了使用者2。

现在,我已经处理过两次msg-1和&msg-2 ......一次来自Consumer-1和Consumer-2

我的问题是

  1. Consumer-1没有通过分区撤销的回调方法来调用?
  2. 我的线程睡眠完成后(来自使用者-1),他尝试使用分区提交偏移量。...我们正在完成分区的重新分配。.您无法提交。这是正确的,但是我如何才能从Consumer-1中获得回调方法。...

-Naresh。

1 个答案:

答案 0 :(得分:0)

  

Consumer-1没有通过分区撤销的回调方法来调用?

如果使用者参与重新平衡,则只能获得已撤销分区的回叫。但是,由于它超时并且确实退出了组,因此它不参与重新平衡,并且经纪人不会向消费者发送任何信息。因此,消费者不知道分区已被撤销(因此无法回叫)。

  

在我的线程睡眠完成之后(来自使用者-1),他尝试使用分区提交偏移量。...我们正在完成分区重新分配。.您无法提交。这是正确的

不确定we are getting partition re-assignment is done的含义:由于使用者没有参与重新平衡,因此它仍然认为拥有分区。因此,它尝试提交,并且正如您正确地说的那样,由于它退出了组,因此(正确)不允许提交。

  

但是我如何才能从消费者1中获得回叫方法呢?...

您需要通过再次致电poll()来重新加入小组,以恢复健康状态。

一般评论:您的超时配置似乎很低,因此不建议在实践中设置这么小的超时。我认为很难建立一个具有如此低超时量的稳定组,因为最有可能的消费者会定期达到超时,退出该组,然后需要重新加入。