Java 最终确定检查点标记的梁模型合同

Java 最终确定检查点标记的梁模型合同,java,apache-kafka,google-cloud-dataflow,apache-beam,apache-beam-io,Java,Apache Kafka,Google Cloud Dataflow,Apache Beam,Apache Beam Io,我正在研究使用KafkaIO从Kafka读取消息的管道,我正在研究CommitteofSetsinFinalize选项和KafkCachePointMark类 我希望至少实现一次消息传递语义,并希望确保在将偏移量写入某个接收器后将其提交给Kafka 从界面上看,还不清楚预计何时完成 它是否依赖于运行程序,在DataflowRunner上执行时会发生什么 读卡夫卡约,读javadoc 也没有给我的理解带来清晰,尤其是短语 但它不提供硬处理保证 问:什么是梁模型合同,何时确定检查点标志,是否有 是的

我正在研究使用KafkaIO从Kafka读取消息的管道,我正在研究CommitteofSetsinFinalize选项和KafkCachePointMark类

我希望至少实现一次消息传递语义,并希望确保在将偏移量写入某个接收器后将其提交给Kafka

从界面上看,还不清楚预计何时完成

它是否依赖于运行程序,在DataflowRunner上执行时会发生什么

读卡夫卡约,读javadoc 也没有给我的理解带来清晰,尤其是短语

但它不提供硬处理保证


问:什么是梁模型合同,何时确定检查点标志,是否有

是的,这种行为取决于跑步者。在DF Runner中,一旦数据被提交到数据流的内部状态,就在流式管道中完成。即,当整个元素束完成处理时


基于文档描述CommitofSetsInFinalize有助于减少再处理,但如果使用它,现在就无关紧要了,无论哪种方式,您都将在DF Runner中至少拥有一次语义。

使用数据流Runner时,一旦从源读取的结果被持久地提交到数据流的内部状态,就会发生检查点终结。这保证了只要更新或耗尽管道,就可以进行一次处理,但如果取消正在运行的管道,则不能这样做。当CommitteOffsetSinFinalize设置为true时,这将导致数据流以这种方式提交分区偏移量


当CommitteofSetsinFinalize为false时,卡夫卡约使用一种不同的、更有效的方式来解读卡夫卡。在此模式下,数据流或其他运行程序将存储它为每个分区读取的偏移量。在这种模式下,不存在数据丢失问题,因为数据不是从Kafka中消耗的,新的管道可以精确地指定Kafka流中开始读取的位置

为了改进文档,我在Apache Beam JIRA中也提出了一个问题。您能详细说明为什么将此选项用于数据流并不重要吗?如果我使用Kafka的autocommit或CommitteofSetsinFinalize,数据流是否没有区别?如果是开源的,您是否可以指出导致这种行为的具体代码?您能否更准确地说明不同和高效的方法是什么?你的意思是启用自动提交吗?如果是这样,如何解决“无数据丢失”的问题?同样在本说明中,您是否有任何链接或其他材料可以添加到您关于“一次保证”的观点中?当CommitteOffsetSinFinalize为false时,KafkaIO源将在内部存储其读取的偏移量,而不是将偏移量提交给Kafka。这意味着Kafka中的数据不会被消耗,因此当您启动一个新管道时,您可以在流中尽可能远的地方启动它。感谢您对此进行详细说明,但是我仍然无法理解,在出现故障场景或简单管道更新的情况下,这如何保证一次交付。