我一直在阅读关于Kafka最近和新的。许多地方说,Kafka将永远不会跟踪分区的offset
和客户端必须记住这个状态。一个这样的地方是这个https://docs.datastax.com/en/kafka/doc/kafka/kafkaHowMessages.html
在上面的页面上,它说这
Topic partitions contain an ordered set of messages and each message in the partition has a unique offset.
Kafka does not track which messages were read by a task or consumer.
字符串
然而,我正在阅读其他来源,例如这个https://kafka.apache.org/36/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html
另一个来源(失去了链接),说使用groupId, topic, partition
的唯一三元组,我们可以使用不同的偏移提交策略,这可能导致像exactly once
,at least once
等场景。他们解释了auto-commit
vs commitSync
vs commitAsync
的利弊,这让我相信,只要指定了上述三元组,并使用了提交API,即使我的客户端(比如在K8 Docker容器中运行)崩溃了,一个新的示例出现了,我也可以从Kafka本身开始这个偏移量(基本上我甚至不必担心),我将从正确的偏移量开始阅读(当然,只有一次,丢失消息,至少有一次的情况发生)。
到底是哪一个DataStax链接是否准确?我在不止一个地方读过,现在很混乱,一些带Kafka的Sping Boot 文章确实也谈到了这个提交场景。
2条答案
按热度按时间pdsfdshx1#
我不熟悉datastax,但决定权在你--在外部跟踪偏移量,并在应用程序启动时执行搜索,或者让Kafka跟踪最后一次提交的偏移量,当消费者再次启动时,它会自动设置位置。
大多数人选择后者(这是Spring的默认行为)。
也许datastax做的是前者。
lqfhib0f2#
两者都是准确的。Kafka经纪人不跟踪偏移量(* 自己 *)。消费者负责将此信息显式存储回Kafka。
如Datastax页面中所述
消费者必须在每个日志中跟踪自己的位置;
是的,消费者团体这样做。框架是无关紧要的
值得指出的是,您正在阅读一个关于Kafka Connectsink连接器的页面
Datastax连接器任务将偏移量存储在config.offset.topic中
这与核心消费者API无关。大多数源连接器将偏移存储在“偏移主题”中,而接收器连接器使用
__consumer_offsets
主题,就像所有其他消费者组一样