代码之家  ›  专栏  ›  技术社区  ›  Arnish Grover

Spring Websocket客户端未向发送确认反应.JS连接或发送消息时的客户端

  •  0
  • Arnish Grover  · 技术社区  · 3 年前

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

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

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

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

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

    enter image description here

    发行

    有时,服务器会突然停止发送确认,或者在连接请求和/或已发送消息的大量延迟(30-40秒)后发送确认。这种情况发生得非常随机(到目前为止,因为我无法找出问题所在),整个服务都停止了。尽管如此,当这个问题存在时,我仍然可以在同一台服务器上发出httpapi请求。重新启动服务器后,问题就消失了。下面是发生这种情况时chrome网络选项卡的屏幕截图

    有连接和第一条消息的确认,但没有后续消息的确认

    我们在最后一行和最后三行看到的“h”只是STOMP的一个指示,表明连接是活动的。

    enter image description here

    也没有对连接的确认 enter image description here

    • 此服务部署在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, 
    

    谢谢

    0 回复  |  直到 3 年前