websocket简介
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它可以在客户端和服务器之间建立持久连接,使得服务器可以主动向客户端推送数据,而不需要客户端不断地向服务器发送请求。
WebSocket 协议的优点包括:
-
实时性:WebSocket 可以实现实时通信,数据传输的延迟非常低。
-
可靠性:WebSocket 建立的连接非常稳定,不会像 HTTP 连接那样容易断开。
-
节省带宽:WebSocket 的数据帧头非常小,相比于 HTTP 请求头,可以节省大量的带宽。
-
跨域支持:WebSocket 可以跨域通信,不受同源策略的限制。
WebSocket 技术的应用场景包括:
-
实时聊天室:WebSocket 可以实现实时聊天室,用户可以实时收到其他用户的消息。
-
在线游戏:WebSocket 可以实现实时在线游戏,玩家可以实时收到游戏中的变化。
-
实时数据展示:WebSocket 可以实现实时数据展示,例如股票行情、天气预报等。
分布式场景无法分享session问题
问题描述
WebSocket在联通用户和服务端的过程,依赖用户的session信息作为通讯的唯一标识,每一次建立连接都会产生唯一的session。WebSocket的session对象没有实现序列化,所以无法通过redis等工具同步到其他节点。
在分布式场景下,A节点存储了用户jack的session,但是底层回调到了B节点上,但是B节点拿不到jack的session对象,无法回推用户结果。
解决方案
应用redis的发布/订阅功能,流程如下:B节点接收到消息后,直接发布一条信息到订阅队列中。A、B节点都会拉到这条消息,每个节点都验证消息体中用户session是否存在本节点,如果存在则使用session中信息触达用户,不存在则不处理。图示如下:
Nginx自动切断连接问题
问题描述
用户与服务端建立连接后,前后端通过心跳来确认通讯状态是否健康。但部署到网关代理的环境中,出现了连接在20秒左右被掐断的问题,后定位到是nginx配置反向代理时会有一个proxy_read_timeout项,意思是连接成功后,等候后端服务器响应时间,现在的配置是20秒。
解决方案
1.修改nginx配置,延长断开时间。
2.不走Nginx、或者使用单独的域名