Apache kafka 如何在kafka中同步多个日志?
假设我有两种类型的日志,它们都有一个公共字段“uid”,如果包含uid的这两种日志的日志都到达了,我想输出日志,比如join,那么Kafka是否可以?是的,绝对可以。查看Kafka Streams,特别是DSL API。它是这样的: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[],
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()
这样的操作也不会产生确定性结果。有关此问题的更多信息,请参阅和此我更新了我的答案,加入了关于决定论的说明。我更新了我的答案,加入了关于决定论的说明。