构建Kafka Streams拓扑时,可以用两种不同的方式对多个主题的读取进行建模:
topologyBuilder.addSource("sourceName", ..., "topic1", "topic2", "topic3");
topologyBuilder.addSource("sourceName1", ..., "topic1")
.addSource("sourceName2", ..., "topic2")
.addSource("sourceName3", ..., "topic3");
相对于Option2,Option1有相对优势吗?所有主题都包含相同类型的数据,并且具有相同的数据处理逻辑。
答案 0 :(得分:2)
鉴于您陈述的那样,所有输入主题都包含相同类型的数据,并且数据的后续处理是等效的,因此您很可能应该选择选项1,原因有以下两个:
1)这将导致拓扑更小
2)您只需要将一个源节点连接到后续处理步骤
如果以后在不同源主题上的处理需要有所不同,则可以将源节点拆分为多个。
答案 1 :(得分:1)
还有其他几个因素需要考虑。
如果输入数据在输入主题之间均匀地分布(按大小和消息速率),则选择1,因为它很简单。 如果不是这样,那么“慢”主题将减慢您的整体消费,因此要在“快速”主题上实现较小的延迟,请选择选项2。
如果您在不同的节点上并行运行多个这样的拓扑(以实现高可用性或高吞吐量),则拥有一个使用者组(选项1)将导致更多使用者在其中进行协调。以我的经验,这也会减慢消费速度,特别是在重新启动使用者(或如果使用者掉线)时。在这种情况下,我还会选择方法2:减少组中的消费者需要更少的精力进行协调,并减少延迟。