Spring Websocket 客户端未在连接或发送消息时向 React.JS 客户端发送确认

问题描述

我有一个基于 WebSocket 的聊天消息系统用于客户支持。后端是在 Spring Boot 中设计的,我使用 STOMP 协议进行 WebSocket 通信。 整个服务的流程有点像

  1. 基于 React.JS 的前端客户端发送一个带有 Upgrade 标头的 HTTP 请求,该请求将连接升级为 WebSocket 连接。服务器反过来发回新连接的确认。我也可以在日志中确认这一点。

  2. 客户端然后在 WebSocket 端点 (/ws/api/register/{userId}) 上发送一个 UUID 生成的字符串来注册新用户以进行聊天消息传递,这还有一些其他用例,例如验证用户,等等,但在这里无关。

  3. 然后客户端订阅一个端点 (/user/chat),在该端点上发送该用户应该接收的来自另一个用户的消息并显示在聊天框上。

  4. 每当一个客户端向另一个客户端发送消息时,它们都会将消息发送到端点 (/ws/api/v1/chat) 并附加包含要发送的聊天框等详细信息的消息的 JSON 正文它进入等(此数据再次用于验证和其他处理)。依次经过处理后,服务器返回一个确认消息,表明它已经收到消息并发送给指定的用户

这就是用户之间进行通信的方式。

下面是 Chrome 上网络选项卡一切顺利时的截图。

enter image description here

问题

有时服务器会突然停止发送确认或在连接请求和/或发送的消息延迟很多(30-40 秒)后发送确认。这种情况非常随机(截至目前,因为我无法找出问题所在),并且整个服务都停止了。虽然,当这个问题存在时,我仍然可以在同一台服务器上发出 HTTP API 请求。重启服务器后问题消失。这是发生这种情况时 chrome 网络选项卡的屏幕截图

确认连接和第一条消息存在,但不确认成功消息

我们在最后一行和倒数第三行中看到的“h”只是来自 STOMP 的指示,表明连接处于活动状态。

enter image description here

也没有确认连接

enter image description here

我做过的事情

  • 此服务部署在 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 (将#修改为@)