将不同的组ID分配给同一应用程序中的不同消费者

时间:2017-05-02 16:24:15

标签: apache-kafka apache-kafka-streams

我知道kafka流提供的并行优势,如果你的并行需求与主题的分区一致,那么它们就会被利用。

我正在考虑让应用程序为不同的消费者群体订阅许多消费者,以便每个消费者都在消费整个主题的复制。

具体来说,我正在考虑让多个线程使用相同的主题来提供不同的结果,即使我知道我可以使用KStreams提供的“链接”计算范例来表达我的所有计算需求。

我考虑不同线程的原因是因为我想要流的多个动态创建的KTable实例。每个人在同一个流(不是子集)上工作并聚合不同的结果。由于它是动态的,它可以创建非常重的负载,可以通过添加线程并行性来缓解。我相信每个线程可以在自己的流实例(和消费者组)上工作的想法是有效的。

当然,我还可以通过让多个线程消耗较小的数据子集并单独进行所有计算(例如,每个维护所有不同KTables的子集)来添加线程并行性,这仍将提供并发性。 / p>

所以,我的问题中有两个要点

  • KafkaStreams通常不适合线程并行,意味着不打算以这种方式使用库吗?

  • 在线程被用于使用主题的情况下,最好让线程遵循处理数据的不同子集的一般kafka并行性概念,从而使线程并行成为应用程序级别类似于使用更多实例进行扩展?

1 个答案:

答案 0 :(得分:3)

  

但我想知道是否可以让一个应用程序将许多消费者订阅到不同的消费者群体,以便每个消费者都在消费整个主题的复制。

您可以考虑在同一Java应用程序中运行多个KafkaStreams实例。每个实例都有自己的StreamsConfig,因此它有自己的application.id和消费者群组ID。

也就是说,根据您的用例,您可能需要查看GlobalKTablehttp://docs.confluent.io/current/streams/concepts.html#globalktable),(稍微简化)确保从Kafka主题中读取的数据适用于Kafka Streams应用程序的所有实例。也就是说,这将允许您“全局复制数据”,而无需运行多个KafkaStreams实例或您上面提到的更复杂的设置。

  

具体来说,我正在考虑让多个线程使用相同的主题来提供不同类型的结果。我可以以某种方式定义每个KafkaStream消费者正在收听的消费者群体吗?

嗯,也许你正在看别的东西。

您知道可以从同一个KStreamKTable实例构建多个计算“链”吗?

KStream<String, Long> input = ...;
KTable<..., ...> firstChain = input.filter(...).groupByKey().count(...);
KTable<..., ...> secondChain = input.mapValues(...);

这将允许您一次阅读Kafka主题,然后根据该主题计算不同的结果。

  

这一般被认为是个坏主意吗?

如果我理解正确,我认为有更好更简单的方法,请参见上文。如果您需要不同的东西,可能需要更新/澄清您的问题。

希望这有帮助!