Maa*_*mon 6 apache-kafka-streams
我只是想确认一些我认为在文档中的内容。如果说kafka 流中的提交与偏移量/消息是否已被应用程序拓扑的整组处理节点处理无关,而仅取决于提交间隔,这样说是否正确?换句话说,在典型的 kafka 消费者应用程序中,当一条消息被完全处理时,人们会提交,而不是只提取,在 Kafka 流中,简单地提取就足以让提交间隔启动并提交该消息/偏移量?也就是说,即使该偏移量/消息尚未被应用程序拓扑的整组处理节点处理?
或者消息是否有资格提交,基于拓扑的整个处理节点集处理它们的事实,并且它们已准备好在主题或外部系统中发出。
从某种意义上说,这个问题可以概括为,偏移/消息何时有资格在 Kafka 流中提交?是有条件的吗?如果是的话,条件是什么?
您已经了解 Kafka Streams 程序,即它Topology包含多个子拓扑(https://docs.confluence.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()查看程序有哪些子拓扑。
| 归档时间: |
|
| 查看次数: |
2737 次 |
| 最近记录: |