带有 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