以下是问题案例。当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();
}
在其他情况下,即在没有这些特定规则的网络中,一切看起来都不错。