apache-kafka-streams - Kafka 流提交偏移语义

标签 apache-kafka-streams

我只是想确认一些我认为介于文档行之间的内容。说 是否正确?提交 在 kafka 流中独立于 偏移量/消息已被应用拓扑的整个处理节点集处理,但仅依赖于提交间隔 ?换句话说,在典型的 kafka 消费者应用程序中,当一条消息被完全处理而不是只获取时,人们会提交,在 Kafka 流中,对于 来说,简单地被获取就足够了。提交间隔启动并提交该消息/偏移量?也就是说,即使那个 偏移量/消息还没有被整个应用拓扑的处理节点集处理过?
或者消息是否有资格提交,基于拓扑的整个处理节点集处理它们的事实,并且它们准备好在主题或外部系统中出去。
从某种意义上说,这个问题可以总结为,偏移/消息什么时候有资格在 Kafka 流中提交?是有条件的吗?如果是这样,条件是什么?

最佳答案

您确实了解 Kafka Streams 程序,即它的 Topology我包含多个子拓扑( https://docs.confluent.io/current/streams/architecture.html#stream-partitions-and-tasks )。子拓扑通过主题相互连接。
如果记录完全由子拓扑处理,则可以提交记录。对于这种情况,记录的中间输出会在提交之前写入连接两个子拓扑的主题。下游子拓扑将从“连接主题”中读取并提交该主题的偏移量。
提交确实基于 commit.interval.ms只要。如果取回返回 100 条记录(偏移量 0 到 99),当 commit.interval.ms 时,子拓扑处理了 30 条记录。命中,Kafka Streams 将首先确保将这 30 条消息的输出刷新到 Kafka(即 Producer.flush()),然后提交偏移量 30 -- 其他 70 条消息仅在 Kafka Streams 的内部缓冲区中,将在提交后进行处理。如果缓冲区为空,则将发送新的提取。每个线程,跟踪 commit.interval.ms独立,如果提交间隔过去,将提交其所有任务。
因为提交是在子拓扑的基础上发生的,所以它可以比输入主题记录被提交,而输出主题还没有结果数据,因为中间结果还没有被下游子拓扑处理。
您可以通过 Topology#describe() 检查程序的结构。查看您的程序具有哪些子拓扑。

关于apache-kafka-streams - Kafka 流提交偏移语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62485305/

相关文章:

java - KStream mapValues 和 transformValues 之间的区别

apache-kafka - 跨多个用户扩展 Kafka 流应用程序

java - Kafka 流 API 示例 KStream 无法解析为类型

java - Kafka 流记录在窗口/聚合后不转发

java - Message Hub 上的 Kafka Streams KTable 配置错误

apache-kafka - KStream 将记录发送到多个流(不是分支)

java - KafkaflapmapValues在传递json数组对象时会将记录拆分成多条记录吗?

apache-kafka-streams - 检查 StateStore 是否已完全填充

java - 如何提取 Kafka Streams 消息中嵌入的时间戳

apache-kafka - Kafka Connect与接收器流