在Spring Flux的短时间内处理大量SSE订户

时间:2017-11-29 14:11:26

标签: java spring-integration project-reactor spring-webflux

以下是问题案例。当sse客户端(网络浏览器或移动设备)落后于具有某些代理/防火墙规则的特定网络基础设施时,似乎无法保持“长”连接。因此,它不断地重新连接到sse端点“GET / sse”,因此一遍又一遍地订阅相同的东西,将服务器上的订户数量相乘。每秒可能会有一堆来自同一客户端的重新连接,这会为Flux增加一堆新订户。从外观来看,会发生的情况是客户端“认为”连接被丢弃并再次订阅,服务器添加了新的订阅,但不会从此客户端发布以前的订阅,因为订阅者数量只会增长。什么是处理/控制这种洪水的正确方法?我的猜测是添加到流链doOnSubscribe()方法并检查此客户端是否已经有一个活动订阅,如果是这样的话 - 取消一个新的订阅。问题是如何检查它。还是有更好的方法吗?谢谢你的任何想法!

使用Spring Boot(v2.0.0.M6)和Flux sse端点。

以下是相关代码:

    @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<MyMessage> appMainChannel() {
        return Flux.from(httpReactiveSource)
               .filter(...)
               .limitRate(1)                
               .map(Message::getPayload)
               .cast(MyMessage.class);
}

@Bean       
public Publisher<Message<String>> httpReactiveSource() {        
    return IntegrationFlows.
            from(mainPubChannel())                                
            .channel(mainSSEOutChannel())                
            .toReactivePublisher();
} 

在其他情况下,即在没有这些特定规则的网络中,一切看起来都不错。

0 个答案:

没有答案