簡體   English   中英

如果在處理步驟中發生故障,如何使 Spring 雲 stream Kafka 流活頁夾重試處理消息?

[英]How to make Spring cloud stream Kafka streams binder retry processing a message if a failure occurs during the processing step?

我正在使用 Spring Cloud Stream 處理 Kafka Streams。 在消息處理應用程序中,可能會產生錯誤。 因此,不應再次提交並重試該消息。

我的申請方法——

@Bean
public Function<KStream<Object, String>, KStream<String, Long>> process() {
return (input) -> {
KStream<Object, String> kt = input.flatMapValues(v -> Arrays.asList(v.toUpperCase().split("\\W+")));
KGroupedStream<String, String> kgt =kt.map((k, v) -> new KeyValue<>(v, v)).groupByKey(Grouped.with(Serdes.String(), Serdes.String()));
KTable<Windowed<String>, Long> ktable = kgt.windowedBy(TimeWindows.of(500)).count();
KStream<String, WordCount> kst =ktable.toStream().map((k,v) -> {
WordCount wc = new WordCount();
wc.setWord(k.key());
wc.setCount(v);
wc.setStart(new Date(k.window().start()));
wc.setEnd(new Date(k.window().end()));

dao.insert(wc);

return new KeyValue<>(k.key(),wc);
});
return kst.map((k,v) -> new KeyValue<>(k, v.getCount()));
};
}

這里如果DAO插入方法失敗,消息不應該發布到output主題並且應該重試相同消息的處理。

我們如何配置 kafka 流綁定器來做到這一點? 非常感謝您對此的任何幫助。

Spring Cloud Stream Kafka Streams binder 本身在執行業務邏輯時不提供此類重試機制。 但是,解決此用例的一種方法可能是將您的關鍵調用(在本例中為dao.insert()包裝在您在本地定義的RetryTemplate中。 這是一個可能的實現,它使用 1 秒的退避策略重試 10 次。 如果您正在嘗試此解決方案,請確保從您的主要業務邏輯中提取與 RetryTemplate 相關的公共代碼。 我還沒有嘗試過,但它應該可以工作。

KStream<String, WordCount> kst =ktable.toStream().map((k,v) -> {
  WordCount wc = new WordCount();
  ...

  org.springframework.retry.support.RetryTemplate retryTemplate = new 
   RetryTemplate();

  RetryPolicy retryPolicy = new SimpleRetryPolicy(10);
  FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
  backOffPolicy.setBackOffPeriod(1000);

  retryTemplate.setBackOffPolicy(backOffPolicy);
  retryTemplate.setRetryPolicy(retryPolicy);

  retryTemplate.execute(context -> {
    try {
      dao.insert(wc);
    }
    catch (Exception e) {
      throw new IllegalStateException(..);
   }
  });

  return new KeyValue<>(k.key(),wc);
});

重試 dao insert 操作 10 次后的事件,如果仍然失敗,則拋出異常終止應用程序,此時不會提交偏移量。 在重新啟動時,在修復了基礎問題后,您的應用程序仍應從此偏移量繼續。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM