卡夫卡流-多个主题是同一来源还是每个来源一个主题?

时间:2019-03-13 12:40:25

标签: apache-kafka apache-kafka-streams

构建Kafka Streams拓扑时,可以用两种不同的方式对多个主题的读取进行建模:

  1. 阅读具有相同源节点的所有主题。

topologyBuilder.addSource("sourceName", ..., "topic1", "topic2", "topic3");

  1. 使用单独的源节点阅读每个主题。
topologyBuilder.addSource("sourceName1", ..., "topic1")
               .addSource("sourceName2", ..., "topic2")
               .addSource("sourceName3", ..., "topic3");

相对于Option2,Option1有相对优势吗?所有主题都包含相同类型的数据,并且具有相同的数据处理逻辑。

2 个答案:

答案 0 :(得分:2)

鉴于您陈述的那样,所有输入主题都包含相同类型的数据,并且数据的后续处理是等效的,因此您很可能应该选择选项1,原因有以下两个:

1)这将导致拓扑更小

2)您只需要将一个源节点连接到后续处理步骤

如果以后在不同源主题上的处理需要有所不同,则可以将源节点拆分为多个。

答案 1 :(得分:1)

还有其他几个因素需要考虑。

如果输入数据在输入主题之间均匀地分布(按大小和消息速率),则选择1,因为它很简单。 如果不是这样,那么“慢”主题将减慢您的整体消费,因此要在“快速”主题上实现较小的延迟,请选择选项2。

如果您在不同的节点上并行运行多个这样的拓扑(以实现高可用性或高吞吐量),则拥有一个使用者组(选项1)将导致更多使用者在其中进行协调。以我的经验,这也会减慢消费速度,特别是在重新启动使用者(或如果使用者掉线)时。在这种情况下,我还会选择方法2:减少组中的消费者需要更少的精力进行协调,并减少延迟。