您现在的位置是:首页 >学无止境 >websocket在分布式场景的应用方案网站首页学无止境

websocket在分布式场景的应用方案

Leo187 2024-07-02 06:01:02
简介websocket在分布式场景的应用方案

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、或者使用单独的域名

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。