我有一个基于WebSocket的聊天信息系统,用于客户支持。后端是在springboot中设计的,我使用STOMP协议进行WebSocket通信。
整个服务的流程有点像
-
-
然后,客户端在WebSocket端点(/ws/api/register/{userId})上发送一个UUID生成的字符串来注册新用户以进行聊天消息传递,这还有一些其他用例,如验证用户等,但在这里是不相关的。
-
然后,客户机订阅一个端点(/user/chat),在该端点上发送来自另一个用户的消息,该用户应该接收这些消息,并在chatbox上显示这些消息。
-
每当一个客户机向另一个客户机发送消息时,他们都会将消息发送到端点(/ws/api/v1/chat),并附加消息的JSON正文,其中包含诸如要发送消息的聊天框等详细信息(此数据再次用于验证和其他处理)。在处理之后,服务器依次发回一个确认,指示消息已经被它接收,并被发送给指定的用户。
这就是用户之间通信的方式。
发行
有时,服务器会突然停止发送确认,或者在连接请求和/或已发送消息的大量延迟(30-40秒)后发送确认。这种情况发生得非常随机(到目前为止,因为我无法找出问题所在),整个服务都停止了。尽管如此,当这个问题存在时,我仍然可以在同一台服务器上发出httpapi请求。重新启动服务器后,问题就消失了。下面是发生这种情况时chrome网络选项卡的屏幕截图
有连接和第一条消息的确认,但没有后续消息的确认
我们在最后一行和最后三行看到的“h”只是STOMP的一个指示,表明连接是活动的。
也没有对连接的确认
-
此服务部署在Nginx负载平衡器后面的AWS实例上,我们已将负载平衡器配置为允许通过端口80和443进行连接,因为TCP将这些端口用于WebSocket连接
-
其他事情
当这个问题存在并且我试图创建一个新的连接时,我可以在我的服务器日志中看到活动,表明请求到达服务器并且建立了一个新的连接,但是随后立即出现一条日志消息,指示套接字正常关闭(状态代码1000),当客户端等待确认时,这是服务器日志
2021-03-31 11:16:18.874 INFO 1 --- [nio-8080-exec-8] .b.w.c.CustomSubProtocolWebSocketHandler : New websocket connection was established
2021-03-31 11:16:18.874 INFO 1 --- [nio-8080-exec-6] .b.w.c.CustomSubProtocolWebSocketHandler : Websocket connect was closed
2021-03-31 11:16:18.874 INFO 1 --- [nio-8080-exec-6] c.o.c.baatchit.common.util.LoggingUtil : methodName = onSocketDisconnected, className = com.oyo.cst.baatchit.websocket.listener.WebSocketStompListener, methodArguments = [SessionDisconnectEvent[sessionId=c0njgu5d, CloseStatus[code=1000, reason=null]]], time = Wed Mar 31 11:16:18 UTC 2021, methodPhase = started, epochTime = 1617189378874,
2021-03-31 11:16:18.874 INFO 1 --- [nio-8080-exec-6] c.o.c.baatchit.common.util.LoggingUtil : returnValue = null, methodName = onSocketDisconnected, className = com.oyo.cst.baatchit.websocket.listener.WebSocketStompListener, methodArguments = [SessionDisconnectEvent[sessionId=c0njgu5d, CloseStatus[code=1000, reason=null]]], timeElapsedInMillis = 0, time = Wed Mar 31 11:16:18 UTC 2021, methodPhase = completed, epochTime = 1617189378874,
谢谢