繁体   English   中英

更改Kafka-streams拓扑(添加重新分区步骤)是否对消息处理保证有任何影响

[英]Does changing the Kafka-streams topology( adding a repartition step) has any effect on message processing guarantee

假设我要对某些转换“ A”进行配置。 这种转换使用状态存储来管理某些状态,并且还需要重新分区 ,这意味着仅在配置后才能进行重新分区。 现在,如果我以以下方式(或任何其他组合)运行该应用程序3次(可能还会进行滚动升级):

  1. 转换“ A”已禁用

  2. 启用转换“ A”

  3. 转换“ A”已禁用

鉴于所有3次运行都使用相同的Kafka经纪人集群:-

  1. 如果启用了EOS,是否会在所有3次运行中都存在EOS保证?

  2. 如果未启用EOS,是否存在可能导致消息丢失的情况(甚至至少提供一次)?

拓扑代码可以更好地了解我要执行的操作:-

KStream<String, Cab> kStream = getStreamsBuilder()
            .stream("topic_a", Consumed.with(keySerde, valueSerde))
            .transformValues(() -> transformer1)
            .transformValues(() -> transformer2, "stateStore_a")
            .flatMapValues(events -> events);

    mayBeEnrichAgain(kStream, keySerde, valueSerde)
            .selectKey((ignored, event) -> event.getAnotherId())
            .through(INTERMEDIATE_TOPIC_2, Produced.with(keySerde, valueSerde)) //this repartitioning will always be there
            .transformValues(() -> transformer3, "stateStore_b")
            .to(txStreamsConfig.getAlertTopic(), Produced.with(keySerde, valueSerde));




private <E extends Cab> KStream<String, E> mayBeEnrichAgain(final KStream<String, E> kStream,
        final Serde<String> keySerde,
        final Serde<E> valueSerde) {

    if(enrichmentEnabled){ //repartitioning is configurable
            return kStream.selectKey((ignored, event) -> event.id())
                    .through(INTERMEDIATE_TOPIC_1, Produced.with(keySerde, valueSerde))
                    .transformValues(enricher1)
                    .transformValues(enricher2);
    }
    else{
            return kStream;
    }
}

您不能简单地更改拓扑而不破坏它。

一般来说,很难说插入贯穿主题是否会首先破坏应用程序。

如果没有中断,则在删除主题时,您可能会“丢失”数据,因为某些未处理的数据可能仍在该主题中,并且在删除主题之后,拓扑将不会读取这些数据。

通常,如果将应用程序升级到可以更改拓扑结构的较新版本,则应彻底重置应用程序或使用新的application.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM