首页 > 解决方案 > 使用单个 kafka 流从多个主题中消费

问题描述

推荐使用哪一个:1.从多个主题消费的单个kafka流2.从不同主题消费的不同kafka流(我已经使用过这个,没有遇到任何问题)

是否有可能实现#1?如果是,有什么影响?如果我使用“EXACTLY_ONCE”设置,它会带来什么样的复杂性?

卡夫卡版本:2.2.0-cp2

标签: apache-kafkakafka-consumer-apiapache-kafka-streamsconfluent-platform

解决方案


是否有可能实现#1(从多个主题消费的单个 kafka 流)

是的,您可以使用StreamsBuilder#stream(Collection<String> topics)

如果您要处理的数据分布在多个主题中,并且这些多个主题构成 一个单一来源,那么您可以使用它,但如果您想并行处理这些主题,则不能。

这就像一个消费者订阅了所有这些主题,这也意味着一个线程可以消费所有主题。当您调用poll()它时,它会ConsumerRecords从所有订阅的主题返回,而不仅仅是一个主题。

在 Kafka 流中,有一个术语叫做拓扑,它基本上是源、处理器和接收器的无环图。拓扑可以包含子拓扑。

然后可以通过并行线程将子拓扑作为独立的流任务执行(参考

由于每个拓扑都可以有一个源,它可以是一个主题,如果您想要并行处理这些主题,那么您必须将您的图分解为子拓扑。

如果我使用“EXACTLY_ONCE”设置,它会带来什么样的复杂性?

当消息到达拓扑中的接收处理器时,必须提交其源,其中源可以是单个主题或主题集合。

多个主题或一个主题,我们需要从生产者向事务发送偏移量,这基本上Map<TopicPartition, OffsetMetadata>是在消息产生时应该提交的。

因此,我认为它不应该引入任何复杂性,无论是具有10 个分区的单个主题还是具有 1 个分区的 10 个主题,因为偏移量是在TopicPartition级别而不是在主题级别。


推荐阅读