【问题标题】:Consuming from multiple topics using single kafka stream使用单个 kafka 流从多个主题中消费
【发布时间】:2020-06-18 12:14:03
【问题描述】:

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

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

kafka 版本:2.2.0-cp2

【问题讨论】:

  • 取决于您的要求和架构。

标签: apache-kafka kafka-consumer-api apache-kafka-streams confluent-platform


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 当我开始使用来自 TOPIC1 的 kafka-stream 并使用 EXACTLY_ONCE 设置进行一些解析时。一切正常。但是问题开始发生(超时)是当我将另一个 kafka 主题(TOPIC2)添加到同一个流中时。错误如下:
  • ERROR org.apache.kafka.streams.processor.internals.StreamTask - task [1_0] Timeout exception caught when initializing transactions for task 1_0. This might happen if the broker is slow to respond, if the network connection to the broker was interrupted, or if similar circumstances arise. You can increase producer parameter max.block.ms` 来增加这个超时时间。` AND org.apache.kafka.common.errors.TimeoutException: Timeout expired while initializing transactional state in 60000ms.
  • @kuti 您是否尝试过提到的变通方法,例如增加max.block.ms 或检查您的代理的连接性?
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 2020-06-03
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
相关资源
最近更新 更多