繁体   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