apache-kafka - 使用单个 kafka 流从多个主题中消费
问题描述
推荐使用哪一个:1.从多个主题消费的单个kafka流2.从不同主题消费的不同kafka流(我已经使用过这个,没有遇到任何问题)
是否有可能实现#1?如果是,有什么影响?如果我使用“EXACTLY_ONCE”设置,它会带来什么样的复杂性?
卡夫卡版本:2.2.0-cp2
解决方案
是否有可能实现#1(从多个主题消费的单个 kafka 流)
是的,您可以使用StreamsBuilder#stream(Collection<String> topics)
如果您要处理的数据分布在多个主题中,并且这些多个主题构成 一个单一来源,那么您可以使用它,但如果您想并行处理这些主题,则不能。
这就像一个消费者订阅了所有这些主题,这也意味着一个线程可以消费所有主题。当您调用poll()
它时,它会ConsumerRecords
从所有订阅的主题返回,而不仅仅是一个主题。
在 Kafka 流中,有一个术语叫做拓扑,它基本上是源、处理器和接收器的无环图。拓扑可以包含子拓扑。
然后可以通过并行线程将子拓扑作为独立的流任务执行(参考)
由于每个拓扑都可以有一个源,它可以是一个主题,如果您想要并行处理这些主题,那么您必须将您的图分解为子拓扑。
如果我使用“EXACTLY_ONCE”设置,它会带来什么样的复杂性?
当消息到达拓扑中的接收器处理器时,必须提交其源,其中源可以是单个主题或主题集合。
多个主题或一个主题,我们需要从生产者向事务发送偏移量,这基本上Map<TopicPartition, OffsetMetadata>
是在消息产生时应该提交的。
因此,我认为它不应该引入任何复杂性,无论是具有10 个分区的单个主题还是具有 1 个分区的 10 个主题,因为偏移量是在TopicPartition级别而不是在主题级别。
推荐阅读
- javascript - react.js 'x' 被分配了一个值,但从未使用过 no-unused-vars
- javascript - 无法将异步函数移动到 Appium PageObjects
- c - [*num - '0'] 是什么意思?
- php - Postgres createdb 从 php exec 运行
- java - 通过 WebDriverManager 使用 Selenium 时如何修复 java.net.UnknownHostException: npm.taobao.org
- clickhouse - 我可以在 quantilesExact 中使用 0 和 1 值吗
- node.js - 使用 NodeJS 验证输入以接受所有语言的字母数字
- ios - SwiftUI 中的数据关联
- vue.js - vue.js 中的复选框选择问题
- python - 使用 python 和 babel 获取翻译的国籍名称列表(或者其他什么?)