为什么服务器有时在高负载(踩踏)下不发送CONNECTED帧?

时间:2019-07-10 08:03:51

标签: java spring-boot rabbitmq spring-websocket stomp

我有这样的设置:用Angular编写的前端应用程序使用ng-stompjs连接到Spring微服务,用作中继以连接到cloud-amqp托管的RabbitMQ集群。

当连接数较少时(200-400),一切正常。但是最近我们接近1000个连接时,服务器突然开始不回复CONNECTED帧。奇怪的是,它并非在所有情况下都失败,而是在三分之二的尝试中失败了。

在成功发送CONNECT帧之后,

http请求可以正常进行并返回101代码。但是,然后没有CONNECTED框架返回,也没有错误。我等了大约10分钟,但什么也没收到。

已经建立的连接可以很好地工作,并很快发送所有消息。

我们在云amqp中使用"Awesome Ape"计划,在负载下它仅使用大约30%的资源,因此我想它不会挨饿。

作为websocket中继,我们使用的是Spring引导应用程序,该应用程序通过docker进行了容器化,并在kubernetes集群的三个节点上作为三个实例运行,并且它们也不会饿死。

@SpringBootApplication
@EnableWebSocketMessageBroker
@EnableWebSocket
public class WsRelayApplication implements WebSocketMessageBrokerConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(WsRelayApplication.class, args);
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*");
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableStompBrokerRelay("/exchange", "/topic")
                .setRelayHost(relayHost)
                .setRelayPort(relayPort)
                .setClientLogin(username)
                .setClientPasscode(password)
                .setSystemLogin(username)
                .setSystemPasscode(password)
                .setVirtualHost(relayVirtualHost);
    }
}

日志包含两种类型的错误,但是它们的负载也很小。

o.s.w.s.s.s.DefaultHandshakeHandler : Handshake failed due to invalid Upgrade header: null

我不知道,为什么我很少(在一个实例日志中仅出现5个此类错误)导致此错误,原因是我在nginx中设置了ssl终止,如以下问题所述:Spring WebSocket: Handshake failed due to invalid Upgrade header: null

o.s.w.s.m.StompSubProtocolHandler : Failed to parse TextMessage payload=[SUBSCRIBE ..], byteCount=119, last=true] in session 28f8037f-194c-7f50-333f-cc19680ca8e1. Sending STOMP ERROR to client. java.lang.IllegalStateException: No decoder for session id '28f8037f-194c-7f50-333f-cc19680ca8e1'

我一直没有注意它们的原因,直到这一刻一切正常,并且我尝试寻找它们的来源的尝试没有成功。

我在信息日志中也有很多运输错误:

INFO 1 --- [MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats : WebSocketSession[8 current WS(8)-HttpStream(0)-HttpPoll(0), 9073 total, 0 closed abnormally (0 connect failure, 0 send limit, 5113 transport error)], stompSubProtocol[processed CONNECT(9037)-CONNECTED(4511)-DISCONNECT(0)], stompBrokerRelay[4521 sessions, ReactorNettyTcpClient[reactor.netty.tcp.TcpClientDoOn@a7f0ab6] (available), processed CONNECT(9038)-CONNECTED(4518)-DISCONNECT(7367)], inboundChannel[pool size = 2, active threads = 0, queued tasks = 0, completed tasks = 572724], outboundChannelpool size = 2, active threads = 0, queued tasks = 0, completed tasks = 1403923], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 46]

我不知道下一步该怎么做才能找到问题。任何帮助将不胜感激。

0 个答案:

没有答案