Kafka Streams - 使用 through() 与 toStream() + to() 重用流
Kafka Streams - reusing streams using through() vs toStream() + to()
我想知道使用 .through() 重用流与 .toStream() + .to() 的流引用的区别
使用.through()
KStream<String, String> subStream = mainStream
.groupByKey(..)
.aggregate(..)
.toStream(..);
.through("aggregate-topic", ..);
// Then use the (new) stream from .through() to create another topic
与使用 .toStream() + .to()
KStream<String, String> subStream = mainStream
.groupByKey(..)
.aggregate(..)
.toStream(..);
subStream.to("aggregate-topic", ..);
//reuse the existing subStream from toStream() to create another topic
我已经实现了一个使用后者的功能,因为在我学习 through() 方法之前这是有意义的。
我现在很好奇的是这两个选项的内部情况;是否有任何 benefits/disadvantages 用于选择一个选项而不是另一个选项?
是的,有区别和不同的权衡:
使用through()
的第一个版本将创建一个“线性计划”并将拓扑分成两个子拓扑。请注意 through("topic")
与 to("topic")
加 builder.stream("topic")
.
完全一样
mainStream -> grp -> agg -> toStream -> to -> TOPIC -> builder.stream -> subStream
第一个子拓扑将从mainStream
到to()
; "aggregate-topic"
将它与由 builder.stream()
组成的第二个子拓扑分开并馈入 subStream
。这意味着,所有数据都先写入 "aggregate-topic"
,然后再读回。这将增加端到端处理延迟并增加额外读取操作的代理负载。优点是,两个子拓扑都可以独立并行化。它们的并行性是独立的,由它们对应的输入主题分区的数量决定。这将创建更多的任务,从而允许更多的并行性,因为两个子拓扑可以在不同的线程上执行。
第二个版本将创建一个“分支计划”并将作为一个子拓扑执行:
mainStream -> grp -> agg -> toStream -+-> to -> TOPIC
|
+ -> 子流
在 toStream()
之后,数据逻辑上广播到两个下游运营商。这意味着,没有通过 "aggregate-topic"
的往返行程,但记录在内存中转发到 subStream
。这减少了端到端延迟,并且不需要从 Kafka 集群读回数据。但是,您的任务较少,因此降低了最大并行度。
我想知道使用 .through() 重用流与 .toStream() + .to() 的流引用的区别
使用.through()
KStream<String, String> subStream = mainStream
.groupByKey(..)
.aggregate(..)
.toStream(..);
.through("aggregate-topic", ..);
// Then use the (new) stream from .through() to create another topic
与使用 .toStream() + .to()
KStream<String, String> subStream = mainStream
.groupByKey(..)
.aggregate(..)
.toStream(..);
subStream.to("aggregate-topic", ..);
//reuse the existing subStream from toStream() to create another topic
我已经实现了一个使用后者的功能,因为在我学习 through() 方法之前这是有意义的。
我现在很好奇的是这两个选项的内部情况;是否有任何 benefits/disadvantages 用于选择一个选项而不是另一个选项?
是的,有区别和不同的权衡:
使用
完全一样through()
的第一个版本将创建一个“线性计划”并将拓扑分成两个子拓扑。请注意through("topic")
与to("topic")
加builder.stream("topic")
.mainStream -> grp -> agg -> toStream -> to -> TOPIC -> builder.stream -> subStream
第一个子拓扑将从mainStream
到to()
; "aggregate-topic"
将它与由 builder.stream()
组成的第二个子拓扑分开并馈入 subStream
。这意味着,所有数据都先写入 "aggregate-topic"
,然后再读回。这将增加端到端处理延迟并增加额外读取操作的代理负载。优点是,两个子拓扑都可以独立并行化。它们的并行性是独立的,由它们对应的输入主题分区的数量决定。这将创建更多的任务,从而允许更多的并行性,因为两个子拓扑可以在不同的线程上执行。
第二个版本将创建一个“分支计划”并将作为一个子拓扑执行:
mainStream -> grp -> agg -> toStream -+-> to -> TOPIC | + -> 子流
在 toStream()
之后,数据逻辑上广播到两个下游运营商。这意味着,没有通过 "aggregate-topic"
的往返行程,但记录在内存中转发到 subStream
。这减少了端到端延迟,并且不需要从 Kafka 集群读回数据。但是,您的任务较少,因此降低了最大并行度。