【问题标题】:Assign different group id to different consumers in the same application在同一应用程序中为不同的消费者分配不同的组 id
【发布时间】:2017-05-03 17:36:25
【问题描述】:

我知道 kafka 流提供的并行性优势,如果您的并行性需求与主题分区保持一致,则可以利用这些优势。

我正在考虑让一个应用程序将许多消费者订阅到不同的消费者组,以便每个消费者都在消费整个主题的副本。

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

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

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

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

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

  • 在使用线程来消费主题的情况下,让线程遵循处理不同数据子集的一般 kafka 并行概念是一个更好的主意,因此使线程并行成为应用程序级别类似于使用更多实例进行扩展?

【问题讨论】:

  • 看着你的问题(包括更新)和@michael-g-noll 回答我仍然不确定你实际尝试做什么,问题是什么......我认为答案给出了很好的指点,但你没有接受它,因此我认为你还有未解决的问题。也许在 Kafka 邮件列表上讨论会更容易:kafka.apache.org/contact
  • KafkaStreams 是多线程的,但它通过分区而不是主题进行扩展。在KafkaStreams 实例中使用多个线程相当于创建多个KafkaStreams 实例(使用相同的拓扑):cf docs.confluent.io/current/streams/…

标签: apache-kafka apache-kafka-streams


【解决方案1】:

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

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

也就是说,根据您的用例,您可能需要查看GlobalKTable (http://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 主题,然后根据该主题计算不同的结果。

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

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多