【问题标题】:Consumer does not know partition revoke消费者不知道分区撤销
【发布时间】:2019-06-17 04:35:42
【问题描述】:

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

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

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

消费者的属性 session.timeout.ms = 15 毫秒。

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

这个消费者开始,分配了分区(调用了正确的回调方法)并且没有消费消息,因为这两条消息由消费者 1 持有。

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

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

我的问题是,

  1. Consumer-1 没有被分区撤销回调方法调用?
  2. 在我的线程睡眠完成后(从消费者 -1 开始),他正尝试使用分区提交偏移量......我们正在完成分区重新分配......您无法提交。这是正确的,但我怎样才能从消费者 1 中获取回调方法......

-纳雷什。

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    Consumer-1 没有被分区撤销回调方法调用?

    如果消费者参与重新平衡,它只能获得分区撤销回调。但是,因为它超时并且确实退出了组,所以它不参与重新平衡,并且代理不向消费者发送任何信息。因此,消费者不知道分区已被撤销(因此,没有回调)。

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

    不确定we are getting partition re-assignment is done 是什么意思:因为消费者不参与重新平衡,它仍然认为它拥有分区。因此,它会尝试提交,并且正如您所说的那样,当它退出组时(正确地)不允许提交。

    但是我怎样才能从 consumer-1 中获取回调方法......

    您需要再次拨打poll() 重新加入群组才能恢复健康状态。

    一般评论:您的超时配置似乎相当低,不建议在实践中设置如此小的超时。我认为很难获得一个具有如此低超时的稳定组,因为消费者很可能会定期超时,退出组,并需要重新加入。

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2017-01-04
      • 1970-01-01
      • 2017-10-17
      • 2018-10-03
      • 1970-01-01
      相关资源
      最近更新 更多