Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡控制流_Java_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Java 卡夫卡控制流

Java 卡夫卡控制流,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我有一个关于kafka流应用程序中的控制流的基本问题。如果有两个源主题A和B。假设A有时间戳早于B的记录。流应用程序处理记录的顺序有保证吗 我做了一个非常初步的测试,当记录被消费时,我偷看了一下,然后用一个简单的速溶软件打印了它们被处理的瞬间 KStream<String, String> akStream= builder.stream("A", Consumed.with(Serdes.String(), Serdes.String()).withOffsetRe

我有一个关于kafka流应用程序中的控制流的基本问题。如果有两个源主题A和B。假设A有时间戳早于B的记录。流应用程序处理记录的顺序有保证吗

我做了一个非常初步的测试,当记录被消费时,我偷看了一下,然后用一个简单的速溶软件打印了它们被处理的瞬间

KStream<String, String> akStream= builder.stream("A",
        Consumed.with(Serdes.String(), Serdes.String()).withOffsetResetPolicy(Topology.AutoOffsetReset.EARLIEST))
        .peek((s, string) -> System.out.println("Topic A at " + Instant.now() ));

KStream<String, String> bkStream= builder.stream("B",
        Consumed.with(Serdes.String(), Serdes.String()))
        .peek((s, string) -> System.out.println("Topic B " + Instant.now()));
主题B记录在主题A之前提取。Sysout显示主题B中的所有记录。有人能帮助理解这一点吗?我希望在编写具有多个输入源的流式应用程序时使用这种理解


提前感谢您构建流的方式,每个流都是独立存在的,没有订购保证

关于根据时间戳处理记录。这只能在一个时间窗口内完成。例如,如果你有两个主题A和主题B,你可以加入它们,通过一个时间窗口,你可以安排活动

<VO,VR> KStream<K,VR> join​(KStream<K,VO> otherStream,
                           ValueJoiner<? super V,? super VO,? extends VR> joiner,
                           JoinWindows windows)
KStream连接​(KStream otherStream,

ValueJoiner视情况而定。一般来说,不同主题之间的处理顺序没有保证。但有一个例外:如果单个任务处理来自不同主题的数据,则记录将按时间戳顺序处理。但是,这是一种尽力而为的方法;从Kafka Streams 2.3开始,这些顺序保证得到了改进d并且你可以使用
max.task.idle.ms
配置来影响他们。

谢谢Alexander!!在我的用例中,主题填充不太频繁,有时会超过几天,因此,我不看窗口,因为我无法确定记录何时出现。我发布的示例很简单,可以理解顺序。TypiCaly我将加入这些主题,然后在稍后的拓扑中通过状态存储(例如)使用这些主题进行丰富。我希望避免状态存储本身未填充的情况,因为向状态存储提供信息的主题尚未处理。谢谢Matthias!!这是我同时尝试的内容1.使用时间戳提取器(基本返回0)来使用我想用作状态存储的主题。2.使用我想要的记录的主题t转换3.在转换器中,从步骤1访问存储查找:即使状态存储已初始化,它也没有任何值,因为peekNextKey返回一个无此类元素异常。为什么状态存储未填充且刚刚初始化??两个流是否具有相同数量的分区和相同的键?--记录a跨不同分区应按时间戳顺序进行处理,因此,对返回0的主题使用时间戳提取器应确保首先处理该主题。
<VO,VR> KStream<K,VR> join​(KStream<K,VO> otherStream,
                           ValueJoiner<? super V,? super VO,? extends VR> joiner,
                           JoinWindows windows)