很抱歉,如果在此之前已经解决了这个问题,我找不到任何紧密相关的内容。我有这个Kafka Streams应用程序,它可以读取多个主题,将记录保留在DB上,然后将事件发布到输出主题。很简单,就Kafka本地商店而言,它是无状态的。 (下面的拓扑)
Topic1(T1)具有5个分区,Topic2(T2)具有单个分区。这里的问题是,尽管涉及两个主题,但如果我想全速使用T1(5个使用者),则不能保证我将为T1上的每个分区都配备专门的使用者。它将分布在两个主题分区中,最终我可能会遇到不平衡的使用者(和空闲的使用者),如下所示:
话虽如此:
使用从同一KafkaStreams实例中的多个主题读取的拓扑是一种好习惯吗?
如果我想让T1成为“全速”,是否有任何方法可以实现如下所示的分区分配? [c1:t1p1,t2p1],[c2:t1p2],[c3:t1p3],[c4:t1p4],[c5:t1p5]
以下哪种拓扑最适合我想要实现的拓扑?还是完全不相关?
选项A(当前拓扑)
Topologies:
Sub-topology: 0
Source: topic1-source (topics: [TOPIC1])
--> topic1-processor
Processor: topic1-processor (stores: [])
--> topic1-sink
<-- topic1-source
Sink: topic1-sink (topic: OUTPUT-TOPIC)
<-- topic1-processor
Sub-topology: 1
Source: topic2-source (topics: [TOPIC2])
--> topic2-processor
Processor: topic2-processor (stores: [])
--> topic2-sink
<-- topic2-source
Sink: topic2-sink (topic: OUTPUT-TOPIC)
<-- topic2-processor
选项B:
Topologies:
Sub-topology: 0
Source: topic1-source (topics: [TOPIC1])
--> topic1-processor
Source: topic2-source (topics: [TOPIC2])
--> topic2-processor
Processor: topic1-processor (stores: [])
--> response-sink
<-- topic1-source
Processor: topic2-processor (stores: [])
--> response-sink
<-- topic2-source
Sink: response-sink (topic: OUTPUT-TOPIC)
<-- topic2-processor, topic1-processor
config1.put("application.id", "app1");
KakfaStreams stream1 = new KafkaStreams(config1, topologyTopic1);
stream1.start();
config2.put("application.id", "app2");
KakfaStreams stream2 = new KafkaStreams(config2, topologyTopic2);
stream2.start();
答案 0 :(得分:2)
您描述的初始分配永远不会发生在Kafka Streams上(而且也不使用任何默认的Consumer配置)。如果有5个分区,而您有5个使用者,则每个使用者将分配1个分区(对于具有自定义PartitionAssignor
的普通使用者,您可以以不同的方式进行分配,但是所有默认实现都将确保适当的负载平衡)。 / p>
使用从同一KafkaStreams实例中的多个主题读取的拓扑是否是一种好习惯?
没有问题。
如果我想让T1成为“全速”,是否有任何方法可以实现如下所示的分区分配? [c1:t1p1,t2p1],[c2:t1p2],[c3:t1p3],[c4:t1p4],[c5:t1p5]
取决于如何编写拓扑,这将是Kafka Streams开箱即用的分配。对于您两个选项,选项B将导致此分配。
以下哪种拓扑最适合我想要实现的拓扑?还是完全不相关?
如上所述,选项B将导致上述分配。对于选项A,您实际上甚至可以使用第6个实例,并且每个实例将仅处理一个分区(因为有两个子拓扑,您将获得6个任务,其中5个用于子拓扑0,1个用于子拓扑1;子拓扑彼此独立地扩展);对于选项A,尽管只有一个子拓扑,但您仅获得5个任务,因此两个输入主题的最大分区数(即5)决定了任务数。
如果我对每个主题使用两个流,而不是对多个主题使用单个流,那么这对我要实现的目标有用吗?
是的,它与选项A基本相同-但是,您得到两个消费者组,因此是“两个应用程序”而不是一个。