簡體   English   中英

Kinesis作為Spring Boot反應式API的生產者

[英]Kinesis as producer in Spring Boot Reactive Stream API

我正在嘗試構建一個小的Spring Boot Reactive API。 API應該讓用戶訂閱一些數據,以SSE形式返回。

數據位於Kinesis主題上。

創建Reactive API和Kinesis的StreamListener相當簡單-但我可以將它們組合在一起,因此Kinesis Topic用作數據服務使用的事件流的生產者。

該代碼看起來或多或少像這樣

//Kinesis binding, with listenerMode: rawRecords
@EnableBinding(Sink.class)
public class KinesisStreamListener {

  @StreamListener(value = Sink.INPUT)
  public void logger(List<Record> payload) throws Exception {

  }
}

@RestController
@RequestMapping("/data")
public class DataResource {

  @Autowired
  DataService service;

  @GetMapping(produces = {MediaType.TEXT_EVENT_STREAM_VALUE, MediaType.APPLICATION_STREAM_JSON_VALUE})
  public Flux<EventObject> getData() {
    return service.getData();
  }
}

@Component
public class DataService {

  Flux<EventObject> getData() {
    Flux<Long> interval = Flux.interval(Duration.ofMillis(1000));
    Flux<EventObject> dataFlux = Flux.fromStream(Stream.generate(() -> ???
            ));
      return dataFlux.zip(interval, dataFlux).map(Tuple2::getT2);
  }
}

這是我如何執行此操作的示例: https : //github.com/artembilan/sandbox/tree/master/cloud-stream-kinesis-to-webflux

一旦我們就細節和一些改進達成共識,可以轉到官方的Spring Cloud Stream Samples存儲庫: https : //github.com/spring-cloud/spring-cloud-stream-samples

主要思想是通過Spring Cloud Stream Reactive Support重用@StreamListener提供的相同Flux 這已經是FluxPublish ,因此任何新的SSE連接都將作為普通的Reactive訂戶使用。

有幾個技巧可以計數:

  1. 對於listenerMode: rawRecords ,我們還需要配置contentType: application/octet-stream以避免在Binder將消息發送到Sink.INPUT通道時進行任何轉換嘗試。
  2. 由於listenerMode: rawRecords返回一個List<Record>我們的Flux@StreamListener方法應該想到正是這種類型,而不是一個簡單的Record

這兩個問題都被視為對框架的改進。

因此,現在讓我們看看它的外觀和工作原理。

暫無
暫無

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

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