使用Flux.cache重用Webflux中的Redis频道订阅

时间:2018-10-09 17:35:40

标签: spring-webflux project-reactor

我正在使用Spring webflux构建一个端点,该端点将流式传输从Redis频道订阅接收的事件。

是这样的:

class MyService(redisTemplate: ReactiveRedisOperations<String, String>) {

    private val redisChannelFlux = redisTemplate
            .listenToChannel("myChannel")
            .map { it.message }
            .cache(0) // transforms this FLux into a reusable Hot publisher

    fun watch() : Flux<String> {
        return redisChannelFlux
    }

}

class MyController(val svc: MyService) {

    @GetMapping("/api/watch", produces = [MediaType.TEXT_EVENT_STREAM_VALUE])
    fun watch() : Flux<String> {
        return svc.watch()
    }

}

有效。当客户端订阅/api/watch端点时,它开始从Redis通道接收新事件,并且我可以在Redis监视器中确认"SUBSCRIBE" "myChannel"仅发生一次,无论有多少客户端连接到我的响应端点。太棒了!

我只是不确定在这种情况下使用Flux.cache()有多安全。我在这里调情灾难吗?是否有建议的方法可以将现有发布服务器与新订阅服务器重用?

1 个答案:

答案 0 :(得分:0)

Flux.cache()通常用于向新订户重播该N中最后Flux个元素。由于在这里您将该数字设置为0,所以似乎您只是在共享资源而不是将最新事件重播给新订户而很有趣。

请记住,您可以只使用Flux.share()。第一个订阅者进入后,该操作员将订阅您的redis实例,并与所有其他共享资源。一旦所有订阅者都离开,与您的Redis实例的连接就会关闭,直到另一个订阅者来临,等等。