如何解决Spring Websocket 客户端未在连接或发送消息时向 React.JS 客户端发送确认
我有一个基于 WebSocket 的聊天消息系统用于客户支持。后端是在 Spring Boot 中设计的,我使用 STOMP 协议进行 WebSocket 通信。 整个服务的流程有点像
-
基于 React.JS 的前端客户端发送一个带有 Upgrade 标头的 HTTP 请求,该请求将连接升级为 WebSocket 连接。服务器反过来发回新连接的确认。我也可以在日志中确认这一点。
-
客户端然后在 WebSocket 端点 (/ws/api/register/{userId}) 上发送一个 UUID 生成的字符串来注册新用户以进行聊天消息传递,这还有一些其他用例,例如验证用户,等等,但在这里无关。
-
每当一个客户端向另一个客户端发送消息时,它们都会将消息发送到端点 (/ws/api/v1/chat) 并附加包含要发送的聊天框等详细信息的消息的 JSON 正文它进入等(此数据再次用于验证和其他处理)。依次经过处理后,服务器返回一个确认消息,表明它已经收到消息并发送给指定的用户。
这就是用户之间进行通信的方式。
问题
有时服务器会突然停止发送确认或在连接请求和/或发送的消息延迟很多(30-40 秒)后发送确认。这种情况非常随机(截至目前,因为我无法找出问题所在),并且整个服务都停止了。虽然,当这个问题存在时,我仍然可以在同一台服务器上发出 HTTP API 请求。重启服务器后问题消失。这是发生这种情况时 chrome 网络选项卡的屏幕截图
确认连接和第一条消息存在,但不确认成功消息
我们在最后一行和倒数第三行中看到的“h”只是来自 STOMP 的指示,表明连接处于活动状态。
我做过的事情
- 此服务部署在 Nginx 负载均衡器后面的 AWS 实例上,我们已将负载均衡器配置为允许通过端口 80 和 443 进行连接,因为 TCP 将这些用于 WebSocket 连接
- 我增加了分配给此实例的资源(cpu 和 RAM),以应对增加的资源使用量,即使我在我使用的日志记录工具中没有发现任何异常峰值。
其他事情
当此问题存在且我尝试创建新连接时,我可以在服务器日志中看到活动,表明请求已到达服务器并已建立新连接,但这立即成功,日志消息表明套接字已正常关闭(状态码 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,timeElapsedInMillis = 0,methodPhase = completed,
请帮助找出问题的可能原因和解决方案,如果需要更多信息,请告诉我。
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。