簡體   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