我有这样的设置:用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]
我不知道下一步该怎么做才能找到问题。任何帮助将不胜感激。