背景
我们有一个卡夫卡主题,其中有稳定的数据流。为了处理它,我们有一个无状态的Flink管道,它使用该主题并写入另一个主题。
我们不时会收到Flink无法处理的突发信息。我们不想将Flink管道和集群配置为始终支持最大负载,我们希望根据负载动态扩展。(预算原因$$$(
我们想到的解决方案
一种方法是向Flink集群添加/删除节点,并更改Flink管道操作符的并行性。这将需要使用快照停止Flink作业,重新配置并行度并使用新的并行度重新启动。
这将是伟大的,但我们不能让自己的停机时间。我们必须在不停机的情况下扩大/缩小规模。
如果我们使用普通的Kafka消费者,那么只需添加一个消费者(假设我们有足够的Kaf卡分区(,Kafka就会在所有消费者之间重新分配主题分区。
Flink Kafka使用者自己管理分区分配和偏移量,这允许只使用一次语义(我们不需要它(。缺点是一个Flink作业总是使用所有的主题分区。
我们认为我们可以创建Flink的另一个实例,该实例将使用相同的组订阅相同的主题,并让Kafka在它们之间分配分区。但为此,我们需要Kafka-Flink消费者让Kafka管理将哪些分区分配给哪个消费者。
我们在找什么
在现有使用者中找不到包含此类使用者或配置的库。我们可以自己写(不那么难(,但如果有现有的解决方案,我们宁愿使用它
我们是不是错过了什么?我们是不是误解了什么?有更好的解决方案吗?
谢谢!
由于您说过在最坏的情况下需要双倍的容量,因此最直接的方法是修改拓扑结构,以便能够将无法快速处理的Kafka消息写入第二个溢出Kafka主题。输入和输出Kafka主题名称都是可配置的。也许您会有一个阈值囤积延迟,它会自动触发写入,或者您会在拓扑中有一个可以在拓扑运行时从外部设置的标志。这是一个你可以处理的设计细节,具有操作意义。
这为您提供了一个Flink拓扑,它可以及时处理最大数量的消息,同时将无法处理的其余消息写入第二个Kafka主题。然后,您可以运行同一Flink拓扑的第二个实例,该实例从第二个主题读取并在必要时写入第三个主题。如果对溢出主题的写入发生在拓扑处理的早期,则可以通过Kafka将其中几个实例链接在一起,而无需重新配置和重新启动任何拓扑。