带有 stomp 的 SpringBoot websocket 无法正确关闭连接
SpringBoot websocket with stomp not closing connections properly
我有一个使用 websocket 和 stomp 作为消息传递协议的应用程序。我按照官方 spring 文档来创建此应用程序。几天后,我收到一份报告,其中应用程序所在的主机 运行 收到了来自普罗米修斯的警报,名为 FdExhaustionClose,据我了解,这意味着某些连接是没有正确关闭。
该应用程序是 运行 在 kubernetes (linux) 中,我们使用 RabbitMQ 作为消息代理。
我该如何解决这个问题? 运行 在本地,我意识到自应用程序启动以来的 连接总数 实际上与未关闭的文件描述符数相匹配。
我检查了生产日志,代理状态正在打印:
WebSocketSession[42 current WS(42)-HttpStream(0)-HttpPoll(0), 52766 total, 0 closed abnormally
还有一个简单的 lsof -p PID | wc -l 返回数字 52752
WebSocketConfig
//...
@Configuration
public class WebSocketChatConfig extends DelegatingWebSocketMessageBrokerConfiguration {
@Autowired
private ApplicationProperties properties;
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/wss").setAllowedOrigins("*");
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
RabbitMqProperties rabbitProperties = properties.getRabbitmq();
ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(tcpClient -> tcpClient
.host(rabbitProperties.getHost())
.port(rabbitProperties.getPort())
.option(ChannelOption.SO_TIMEOUT, 3600000)
.noProxy()
.secure(SslProvider.defaultClientProvider()), new StompReactorNettyCodec());
registry.setApplicationDestinationPrefixes("/app", "/topic", "/chat");
registry.enableStompBrokerRelay("/topic")
.setRelayHost(rabbitProperties.getHost())
.setRelayPort(rabbitProperties.getPort())
.setVirtualHost(rabbitProperties.getUsername())
.setSystemLogin(rabbitProperties.getUsername())
.setSystemPasscode(rabbitProperties.getPassword())
.setClientLogin(rabbitProperties.getUsername())
.setClientPasscode(rabbitProperties.getPassword()).setTcpClient(client);
}
}```
经过一番研究,我发现问题与软件包 reactor-netty 有关,显然 there was a leak 在版本 0.9.8 中,泄漏已修复版本 0.9.9
我有一个使用 websocket 和 stomp 作为消息传递协议的应用程序。我按照官方 spring 文档来创建此应用程序。几天后,我收到一份报告,其中应用程序所在的主机 运行 收到了来自普罗米修斯的警报,名为 FdExhaustionClose,据我了解,这意味着某些连接是没有正确关闭。
该应用程序是 运行 在 kubernetes (linux) 中,我们使用 RabbitMQ 作为消息代理。
我该如何解决这个问题? 运行 在本地,我意识到自应用程序启动以来的 连接总数 实际上与未关闭的文件描述符数相匹配。
我检查了生产日志,代理状态正在打印:
WebSocketSession[42 current WS(42)-HttpStream(0)-HttpPoll(0), 52766 total, 0 closed abnormally
还有一个简单的 lsof -p PID | wc -l 返回数字 52752
WebSocketConfig
//...
@Configuration
public class WebSocketChatConfig extends DelegatingWebSocketMessageBrokerConfiguration {
@Autowired
private ApplicationProperties properties;
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/wss").setAllowedOrigins("*");
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
RabbitMqProperties rabbitProperties = properties.getRabbitmq();
ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(tcpClient -> tcpClient
.host(rabbitProperties.getHost())
.port(rabbitProperties.getPort())
.option(ChannelOption.SO_TIMEOUT, 3600000)
.noProxy()
.secure(SslProvider.defaultClientProvider()), new StompReactorNettyCodec());
registry.setApplicationDestinationPrefixes("/app", "/topic", "/chat");
registry.enableStompBrokerRelay("/topic")
.setRelayHost(rabbitProperties.getHost())
.setRelayPort(rabbitProperties.getPort())
.setVirtualHost(rabbitProperties.getUsername())
.setSystemLogin(rabbitProperties.getUsername())
.setSystemPasscode(rabbitProperties.getPassword())
.setClientLogin(rabbitProperties.getUsername())
.setClientPasscode(rabbitProperties.getPassword()).setTcpClient(client);
}
}```
经过一番研究,我发现问题与软件包 reactor-netty 有关,显然 there was a leak 在版本 0.9.8 中,泄漏已修复版本 0.9.9