Apache kafka 如何在kafka中同步多个日志?

Apache kafka 如何在kafka中同步多个日志?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,假设我有两种类型的日志,它们都有一个公共字段“uid”,如果包含uid的这两种日志的日志都到达了,我想输出日志,比如join,那么Kafka是否可以?是的,绝对可以。查看Kafka Streams,特别是DSL API。它是这样的: StreamsBuilder builder = new StreamsBuilder(); KStream<byte[], Foo> fooStream = builder.stream("foo"); KStream<byte[],

假设我有两种类型的日志,它们都有一个公共字段“uid”,如果包含uid的这两种日志的日志都到达了,我想输出日志,比如join,那么Kafka是否可以?

是的,绝对可以。查看Kafka Streams,特别是DSL API。它是这样的:

 StreamsBuilder builder = new StreamsBuilder();

 KStream<byte[], Foo> fooStream = builder.stream("foo");

 KStream<byte[], Bar> barStream = builder.stream("bar");

 fooStream.join(barStream,
                (foo, bar) -> {
                    foo.baz = bar.baz;
                    return foo;
                },
                JoinWindows.of(1000))
          .to("buzz");
StreamsBuilder builder=newstreamsbuilder();
KStream fooStream=builder.stream(“foo”);
KStream barStream=builder.stream(“bar”);
fooStream.join(barStream,
(foo,bar)->{
foo.baz=bar.baz;
返回foo;
},
JoinWindows.of(1000))
。致(“嗡嗡声”);
这个简单的应用程序使用两个输入主题(“foo”和“bar”),将它们合并并写入主题“buzz”。由于流是无限的,当连接两个流时,您需要指定一个连接窗口(1000毫秒以上),该窗口是相应流上两条消息之间的相对时间差,以使它们符合连接条件

下面是一个更完整的示例:

以下是文档:。您会发现可以执行多种不同类型的联接:


需要注意的是,尽管上面的示例在重置和重新处理拓扑时会确定地同步流,但每次并非Kafka流中的所有连接操作都是确定的时,都会得到相同的结果。从1.0.0版及之前的版本开始,大约有一半是不确定的,可能取决于从底层主题分区消耗的数据顺序。具体来说,内部
KStream
-
KStream
和所有
KTable
-
KTable
联接都是确定性的。其他联接,如所有
KStream
-
KTable
联接和左/外
KStream
-
KStream
联接都是不确定的,取决于使用者使用的数据顺序。如果要将拓扑设计为可再处理的,请记住这一点。如果使用这些非确定性操作,当拓扑实时运行时,事件到达的顺序将产生一个结果,但如果重新处理拓扑,则可能会得到另一个结果。请注意,像
KStream#merge()
这样的操作也不会产生确定性结果。有关此问题的更多信息,请参阅和此

是,绝对正确。查看Kafka Streams,特别是DSL API。它是这样的:

 StreamsBuilder builder = new StreamsBuilder();

 KStream<byte[], Foo> fooStream = builder.stream("foo");

 KStream<byte[], Bar> barStream = builder.stream("bar");

 fooStream.join(barStream,
                (foo, bar) -> {
                    foo.baz = bar.baz;
                    return foo;
                },
                JoinWindows.of(1000))
          .to("buzz");
StreamsBuilder builder=newstreamsbuilder();
KStream fooStream=builder.stream(“foo”);
KStream barStream=builder.stream(“bar”);
fooStream.join(barStream,
(foo,bar)->{
foo.baz=bar.baz;
返回foo;
},
JoinWindows.of(1000))
。致(“嗡嗡声”);
这个简单的应用程序使用两个输入主题(“foo”和“bar”),将它们合并并写入主题“buzz”。由于流是无限的,当连接两个流时,您需要指定一个连接窗口(1000毫秒以上),该窗口是相应流上两条消息之间的相对时间差,以使它们符合连接条件

下面是一个更完整的示例:

以下是文档:。您会发现可以执行多种不同类型的联接:


需要注意的是,尽管上面的示例在重置和重新处理拓扑时会确定地同步流,但每次并非Kafka流中的所有连接操作都是确定的时,都会得到相同的结果。从1.0.0版及之前的版本开始,大约有一半是不确定的,可能取决于从底层主题分区消耗的数据顺序。具体来说,内部
KStream
-
KStream
和所有
KTable
-
KTable
联接都是确定性的。其他联接,如所有
KStream
-
KTable
联接和左/外
KStream
-
KStream
联接都是不确定的,取决于使用者使用的数据顺序。如果要将拓扑设计为可再处理的,请记住这一点。如果使用这些非确定性操作,当拓扑实时运行时,事件到达的顺序将产生一个结果,但如果重新处理拓扑,则可能会得到另一个结果。请注意,像
KStream#merge()
这样的操作也不会产生确定性结果。有关此问题的更多信息,请参阅和此

我更新了我的答案,加入了关于决定论的说明。我更新了我的答案,加入了关于决定论的说明。