我最近一直在阅读有关 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/090/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 容器中运行)崩溃并出现一个新实例向上,我可以从卡夫卡本身偏移(基本上我什至不必担心),我将从正确的偏移开始读取(当然,恰好一次、丢失消息、至少一次发挥作用的场景) .
那么是哪一个呢? DataStax 链接准确吗?我在不止一个地方读过它。 现在很混乱。一些使用 Kafka 的 Spring Boot 文章也讨论了这种提交场景。
我不熟悉 datastax,但决定取决于你 - 跟踪外部偏移量并在应用程序启动时执行搜索,或者让 Kafka 跟踪最后提交的偏移量,并在消费者使用时自动为其设置位置重新开始。
大多数人选择后者(这是 Spring 的默认行为)。
也许 datastax 可以做到前者。