卡夫卡的消费者ID和组ID:什么使两个消费者相同

时间:2019-05-16 16:15:09

标签: apache-kafka kafka-consumer-api publish-subscribe

我已经使用Kafka几个月了,我意识到一些核心概念对我来说还不太清楚。我的怀疑与消费者ID,组ID和偏移量之间的关系有关。在我们的应用程序中,我们需要Kafka使用发布-订阅范例来工作,因此我们为每个消费者使用不同的组ID,这些ID是随机生成的。

我以前认为设置auto.offset.reset = latest我的消费者将始终收到他们尚未收到的消息,但是最近我学会了that is not the case。这只有在消费者尚未抵消承诺的情况下才有效。在任何其他情况下,使用者将继续接收偏移量大于其提交的最后一个偏移量的消息。

由于我总是创建具有随机组ID的新使用者,因此我意识到我的使用者没有内存,他们是新使用者,并且永远不会提交偏移量,因此auto.offset.reset = latest策略将始终适用。这就是我开始怀疑的地方。 假设以下情况

  1. 我有两个客户端应用程序A和B,每个都有一个使用者,以发布-订阅方式工作(因此,具有不同的组ID)。两个使用者都订阅了主题my-topic。两个使用者的auto.offset.reset设置为latest
  2. 一些生产者(或多个生产者)将消息M1,M2和M3发布到主题my-topic
  3. A和B都收到M1,M2和M3。
  4. 现在我关闭应用程序B。
  5. 生产者产生消息M4和M5。
  6. 应用程序A接收消息M4和M5。
  7. 现在我重新启动应用程序B。请记住,groupId是随机的,并且我没有设置任何使用者ID,因此这意味着这是一个新使用者(对吗?)。应用程序B没有收到任何消息。
  8. 生产者发布消息M6和M7。
  9. 应用程序A和B都接收消息M6和M7。

因此,总结一下,如果我没记错的话,A会收到所有消息,但B会错过M4和M5。我已经用kafka-console-consumer.sh尝试过了,它的行为是这样的。

那么,如何使应用程序B在关闭时接收发布的消息?现在,如果我启动它并为其分配与最初启动时相同的groupId,它将读取消息M4和M5,但这是在设置组ID。是否也可以设置消费者ID并获得相同的行为?

或者换句话说,重新启动相同的使用者将理解什么?如果两个使用者具有相同的groupId和相同的consumerId,则它们是相同的使用者吗?

顺便说一下,consumerId和属性client.id是相同的吗?

2 个答案:

答案 0 :(得分:1)

如果两个使用者的group.id设置相同,则它们属于同一组。

我不确定您对consumerId的含义。从Kafka 2.2开始,consumer configurations中不存在此类字段。

如果您在谈论client.id,则此设置没有功能作用,它仅用于标记请求,以便在需要时可以在代理日志中进行匹配。

使用auto.offset.reset=latest运行使用者时,如果不存在任何已提交的偏移量,则使用者将从日志末尾重新开始使用。因此,它将仅接收启动后产生的消息。因此,在您的情况下,您是对的,它将永远不会收到M4和M5。

如果要使用所有消息,则需要保持相同的group.id。在这种情况下,auto.offset.reset仅在消费者第一次启动时适用。这样,当使用者重新启动时,它将恢复停止时的状态。

答案 1 :(得分:0)

这是因为您正在设置auto.offset.reset = Latest

使用方期间未启动并运行的任何消息都不会被使用方处理。

所以B会漏掉两条消息