![](/img/trans.png)
[英]How to start a Kafka-Streams Pipeline by Topology using Quarkus
[英]Does changing the Kafka-streams topology( adding a repartition step) has any effect on message processing guarantee
假設我要對某些轉換“ A”進行配置。 這種轉換使用狀態存儲來管理某些狀態,並且還需要重新分區 ,這意味着僅在配置后才能進行重新分區。 現在,如果我以以下方式(或任何其他組合)運行該應用程序3次(可能還會進行滾動升級):
轉換“ A”已禁用
啟用轉換“ A”
轉換“ A”已禁用
鑒於所有3次運行都使用相同的Kafka經紀人集群:-
如果啟用了EOS,是否會在所有3次運行中都存在EOS保證?
如果未啟用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.