首页 > 其他分享 >浅谈分布式环境下WebSocket消息共享问题

浅谈分布式环境下WebSocket消息共享问题

时间:2023-03-21 14:33:06浏览次数:54  
标签:WebSocket 浅谈 Redis session 共享 Socket 分布式

浅谈分布式环境下WebSocket消息共享问题

技术分析

我们在开发时会遇到需要使用即时通讯的场景,当然,实现方式很多,SocketMQTTNetty....等等。

具体用哪种就在于业务的需求了,去选择合理的方式实现。

今天小简要聊的场景便是分布式环境下,WebSocket的消息共享问题。

分布式环境下,业务方面往往最需要解决的是数据同步共享这类问题。

此时出现了一个场景,后端存在一个分布式服务,我需要两个服务都能收到WebSocket的消息,如何去实现?

或者说,服务端项目存在多个负载均衡实例,实例均在不同的实例上,这样当一次请求负载到A服务器实例时,socketsession在A服务器线程上,第二次请求负载到另一台B服务器的实例,此时B服务器并不存在A服务器的Session(即Socket的会话消息)。

思考解决

思路一(失败)

我们首先思考,改如何解决这个问题呢?要实现同步,根据上面的需求,我们可以直接定位到Socket的Session不能共享问题,只要可以共享会话对象,那就可以解决当前问题。

没错,小简也是这样想的,但是,实际上是错误的,请看下文。

我们首先联想到,分布式下,我们的分布式锁、分布式状态信息,都是可以通过Redis去实现一个共享的,那我们直接给SocketSession通过Redis共享不就可以。

思路确实是对的,但是使用Redis共享对象是有条件的,要去实现Serializable接口,才可以被序列化。

我们查看源码就会发现,SocketSession是不能被序列化的,那自然不能去使用Redis来实现Session对象的共享了。

为什么HttpSession可以使用Redis共享?
/**
 * @author JanYork
 * @date 2023/3/14 11:36
 */
org.apache.catalina.session.StandardManager
org.apache.catalina.session.PersistentManager

WEB的中的HttpSession主要是通过上面的两个管理器实现序列化的。

StandardManagerTomcat默认使用的,在web应用程序关闭时,对内存中的所有HttpSession对象进行持久化,把他们保存到文件系统中。

默认的存储文件为:<tomcat安装目录>/work/Catalina/<主机名>/<应用程序名>/sessions.ser

PersistentManagerStandardManager更为灵活,只要某个设备提供了实现org.apache.catalina.Store接口的驱动类,PersistentManager就可以将HttpSession对象保存到该设备。

所以spring-session-redis解决分布场景下的session共享就是将session序列化到redis中,使用filter加装饰器模式解决分布式场景httpsession享问题。

注:此段参考自程序员DD大佬的文章。

思路二

既然不能共享对象,那我们共享消息不就可以,我们的目的是要其他实例也可以收到Socket的消息,那我们就是个1n的消息模型,一对多消息那就简单了。

哪些方法?

首先我们会第一时间想到,MQ,也就是消息队列中间件。

其次我们也可以使用Redis的发布订阅功能实现。

MQ

使用MQ去实现一对多消息,相信也不需要我多说,MQ天然的广播、发布订阅、点对点、路由这些消息模式可以很方便的解决这个问题。

Redis

Redis实现有大佬已经写过了,请参考:

如何使用Redis解决WebSocket分布式场景下的Session共享问题: https://cloud.tencent.com/developer/article/1955783

尾述

说浅谈就浅谈,文章就这么短(暗暗窃喜:又水一篇,嘿嘿),下篇再见。

标签:WebSocket,浅谈,Redis,session,共享,Socket,分布式
From: https://www.cnblogs.com/JanYork/p/17239908.html

相关文章

  • [浅谈] 二维数据结构——树套树
    \(\color{purple}\text{Ⅰ.二维树状数组}\)\(\color{orange}\text{例一:P3372【模板】线段树1}\)$\color{green}\text{2023.1.1014:32}$回忆一下树状数组的区间修改......
  • [浅谈] 线段树优化建边
    \(\color{purple}\text{P6348[PA2011]Journeys}\)\(\color{green}\text{2023.1.1010:58}\)线段树优化建边。题意:给定一个图,每次对区间\([a,b]\)至区间\([c,d]\)建......
  • 浅谈集合HashSet
    HashSet简介HashSet集合继承于Collection集合,Collection集合的常用方法也在HashSet中同样适用。底层原理:HashSet集合底层采用哈希表存储数据,底层是new了一个HashMap,a......
  • WebSocket 测试工具
    WebSocket测试工具 一、WebSocket简介WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端......
  • 浅谈市政施工中深基坑支护技术施工中的难点与突破途径 方芳 武汉市江夏区公路建筑工程
    浅谈市政施工中深基坑支护技术施工中的难点与突破途径方芳武汉市江夏区公路建筑工程公司   湖北武汉    430200http://www.qikan.com.cn/newarticleinfo/828c2......
  • Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
    文章目录​​1.Sa-Token介绍​​​​2.登录认证​​​​2.1登录与注销​​​​2.2会话查询​​​​2.3Token查询​​​​3.权限认证​​​​3.1获取当前账号权限码......
  • Matter 中的分布式合规设备总帐 (DCL)(转自乐鑫博客)
    Matter的优势之一在于Matter设备制造商(供应商)无需自己开发手机APP或云服务,其Matter设备就可以加入任何支持Matter的生态系统,与生态中的其他Matter设备无缝互联......
  • 分布式调用跟踪
    随着服务的拆分,系统的模块变得越来越多,不同的模块可能由不同的团队维护,一个请求可能会涉及几十个服务的协同处理,牵扯到多个团队的业务系统。假设现在某次服务调用失败,或......
  • Java项目是不是分布式,真有那么重要吗?
    大家好,我是3y啊。大概不知道从什么时候,「微服务」「分布式」这两个词又再次频繁出现在我的视线里。「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了......
  • 浅谈云原生基础入坑与docker 搭建redis-cluster集群
    浅谈云原生基础入坑与docker搭建redis-cluster集群开篇来点自己的小感触:自从走上后端开发这条无法回头的互卷道路以后,在视野内可见新的技术在迭代,更新的技术在不断发行。......