我已经使用Kafka几个月了,我意识到一些核心概念对我来说还不太清楚。我的怀疑与消费者ID,组ID和偏移量之间的关系有关。在我们的应用程序中,我们需要Kafka使用发布-订阅范例来工作,因此我们为每个消费者使用不同的组ID,这些ID是随机生成的。
我以前认为设置auto.offset.reset = latest
我的消费者将始终收到他们尚未收到的消息,但是最近我学会了that is not the case。这只有在消费者尚未抵消承诺的情况下才有效。在任何其他情况下,使用者将继续接收偏移量大于其提交的最后一个偏移量的消息。
由于我总是创建具有随机组ID的新使用者,因此我意识到我的使用者没有内存,他们是新使用者,并且永远不会提交偏移量,因此auto.offset.reset = latest
策略将始终适用。这就是我开始怀疑的地方。 假设以下情况:
my-topic
。两个使用者的auto.offset.reset
设置为latest
。 my-topic
。 groupId
是随机的,并且我没有设置任何使用者ID,因此这意味着这是一个新使用者(对吗?)。应用程序B没有收到任何消息。因此,总结一下,如果我没记错的话,A会收到所有消息,但B会错过M4和M5。我已经用kafka-console-consumer.sh
尝试过了,它的行为是这样的。
那么,如何使应用程序B在关闭时接收发布的消息?现在,如果我启动它并为其分配与最初启动时相同的groupId,它将读取消息M4和M5,但这是在设置组ID。是否也可以设置消费者ID并获得相同的行为?
或者换句话说,重新启动相同的使用者将理解什么?如果两个使用者具有相同的groupId和相同的consumerId,则它们是相同的使用者吗?
顺便说一下,consumerId和属性client.id是相同的吗?
答案 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会漏掉两条消息