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

JAVA使用WebSocket实现多客户端请求 小程序和app端两个服务之间实现聊天通讯,因为介于两个服务,两个客户端,方案实现 阅读详情

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

技术分析

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

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

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

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

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

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

思考解决

思路一(失败)

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

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

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

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

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

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

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

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

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

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

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

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

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

哪些方法?

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

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

MQ

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

尾述

说浅谈就浅谈,文章就这么短(暗暗窃喜:又水一篇,嘿嘿),下篇再见。
vue使用websocket websocket其他特点如下: (1)建立在 TCP 协议之上,服务器端的实现比较容易。 (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 (3)数据格式比较轻量,性能开销小,通信高效。 (4)可以发送文本,也可以发送二进制数据。 (5)没有同源限制,客户端可以与任意服务器通信... 阅读详情

相关推荐

Redis实现WebSocket分布式通信

采用技术:springboot、websocket、redis发布订阅; 基于Redis实现Spring WebSocket分布式通信。 环境说明:spring-boot-2.5.6、springframework-5.3.12,spring-websocket-5.3.12、spring-data-redis-2.5.6、JDK 8 实现服务端多节点的情况下,主动推送消息到客户端(即设备1、2、......N)

分布式集群下WebSocket Session共享解决方案

WebSocket Session共享解决方案

Java的一只小实习生的博客 5604

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2286

分布式websocket实时通讯的session共享问题

Bean@Autowired@Bean@Override.collection(collectionName) // 需要监听的集合名// 过滤需要监听的操作类型,可以根据需求指定过滤条件// 不设置时,文档更新时,只会发送变更字段的信息,设置UPDATE_LOOKUP会返回文档的全部信息.build();

weixin_42211693的博客 1962

从深算一号到三号:海光DCU的技术演进与国产超算突围之路

本文梳理了海光DCU从深算一号到三号的技术演进历程,展现了国产高性能计算芯片从填补空白到追赶并行的突围之路。文章重点分析了深算系列在性能提升、软件生态(DTK)建设及超算平台构建方面的关键进展,并探讨了其在AI大模型训练、科学计算等领域的应用实践与未来挑战。

ipfs8storage的博客 1062

4×V100部署Qwen3.8-Flash-Next:vLLM/GGUF实战

大模型本地部署的核心,是把参数量、量化精度、显存容量和推理框架放在同一张账本里算清楚。MoE 模型总参数量大但激活参数少,解码阶段更受显存带宽与 KV Cache 限制;通过 INT4/AWQ 或 GGUF 等 4-bit 量化可显著压缩权重占用,再结合 vLLM 张量并行、llama.cpp 分层切分提升多卡利用率。其技术价值在于让 V100 这类老架构 GPU 也能承载百亿级参数模型的私有化推理,并服务于 RAG 知识库、工作流 API、批量生成等场景。这次围绕 4×V100 32G 部署 Qwen3.

weixin_29061425的博客 349

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

要实现同步,根据上面的需求,我们可以直接定位到Socket的Session不能共享问题,只要可以共享会话对象,那就可以解决当前问题。或者说,服务端项目存在多个负载均衡实例,实例均在不同的实例上,这样当一次请求负载到A服务器实例时,在A服务器线程上,第二次请求负载到另一台B服务器的实例,此时B服务器并不存在A服务器的。既然不能共享对象,那我们共享消息不就可以,我们的目的是要其他实例也可以收到。我们首先联想到,分布式下,我们的分布式锁、分布式状态信息,都是可以通过。去实现一对多消息,相信也不需要我多说,

Jan's的博客 1249

保姆级教程:用Wokwi玩转ESP32 MicroPython仿真(含库文件配置指南)

本教程详细介绍了如何使用Wokwi平台进行ESP32 MicroPython仿真开发,包括库文件配置、传感器数据模拟和REPL调试技巧。通过Wokwi的仿真调试系统,开发者可以在浏览器中快速验证代码逻辑,提高开发效率,特别适合物联网项目的快速迭代。

weixin_29195615的博客 446

浅谈6种API架构模式

在摸鱼刷X时,看到一张非常棒的图,是关于不同API架构的,下面学习记录一下。(摘自网络)

ldcaws的专栏 620

setoolkit克隆网站获取用户信息

一、环境 kali、DVWA 二、步骤 首先打开kali,输入setoolkit 依次选择选项1-选项2-选项3-选项2 输入钓鱼网站的网址(默认为本地网址) 输入要克隆的网址URL 这里我的网址如图,将网址复制 然后模拟攻击场景,攻击者向受害者发送了一条钓鱼链接,此链接与DVWA的登陆页面完全一样,受害者点击之后并进行登陆信息 点击login之后,用户信息就被setool...

BeatRex的博客 2997

IO多路转接 ——— select、poll、epoll

select是系统提供的一个多路转接接口。select函数的函数原型如下: 参数说明:参数timeout的取值:返回值说明:select调用失败时,错误码可能被设置为:fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。 调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用

2021dragon的博客 7978

Websocket Session 共享解决

Websocket Session 共享解决(方案一) 既然Websocket Session不能直接序列化然后存储,而且如果用户请求的时候,开始与集群中的A节点创建链接,就算把这个Session 拿到B节点去再给用户Push消息,应该也是不通(没测试)的。 所以我的解决方案采用订阅式队列去触发Websocket 反推的方式来实现看上去是Session共享 的,思路如下图: Websocket Session共享 思路图解释: 模块一:这里没有什么好说明的,因为每一...

qq_27276663的博客 6534

C# + NAudio:构建支持实时音频处理的语音聊天应用(含回声消除)

本文介绍了如何利用C#和NAudio库开发实时语音聊天应用,重点实现回声消除功能。首先概述了NAudio库在音频处理中的作用,包括音频录制、播放和实时处理能力。然后详细讲解了构建基础语音聊天应用的过程,包括麦克风录制和扬声器播放的实现。接着深入探讨了回声消除的原理和实现方法,提出通过比较麦克风输入和扬声器输出的音频信号来消除回声,并给出了核心代码示例。最后,文章还讨论了性能优化方向,如多线程处理和网络传输扩展。该方案为开发高质量实时语音应用提供了实用参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1011

解决websocket集群的session共享问题

在websocket中,服务端主要使用的是session打交道,但是由于session无法实现序列化,不能存储到redis这些中间存储里面,因此这里我们只能把session存储在本地的内存中,那么如果是集群的话,我们如何实现session准确的发送消息呢,其实就是session共享。

askuld的博客 2707

SAP 系统和银行系统通过 SM2 加密算法进行集成

SM2 是基于椭圆曲线离散对数问题(ECDLP)的一种公钥密码算法。椭圆曲线加密的核心原理,是利用了一个数学难题:在椭圆曲线群上,已知曲线上两点的运算结果,逆向推导出这两个点的具体信息是非常困难的。这样的复杂度使得基于椭圆曲线的密码体制比传统的 RSA 更加难以破解。在 SM2 加密中,公钥和私钥的生成与传统的椭圆曲线加密类似。选择一个椭圆曲线和一个基点 P。使用私钥 d,计算公钥 P’ = d * P。私钥 d 保密,而公钥 P’ 可公开分发,用于加密数据。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1212

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring Boot 中的 WebSocketSession 是什么,原理,如何使用

WebSocketSession 是 Spring Boot 中用于与客户端进行 WebSocket 通信的核心概念。在使用 WebSocketSession 时,我们需要先添加 Spring Boot 的 WebSocket 依赖,然后配置 WebSocket,并实现一个 WebSocket 处理器,最后在处理器中使用 WebSocketSession 进行通信。客户端也可以使用 WebSocketSession 进行通信,非常简单。

程序猿徐师兄的博客 9075

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

使用Redis解决WebSocket分布式场景下的Session共享问题

StandardManager是Tomcat默认使用的,在web应用程序关闭时,对内存中的所有HttpSession对象进行持久化,把他们保存到文件系统中。时,socketsession在第一台服务器线程上,第二次请求,负载到第二台服务器上,需要通过id查找当前用户的session时,是查找不到的。可以看到,我们给8080服务发送的消息,我们订阅的8081和8082 服务可以也可以使用该编号进行消息的推送。在显示项目中遇到了一个问题,需要使用到websocket与小程序建立长链接。使用postman给。

境_个人中心 4359

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

websocket替代方案_分布式WebSocket集群解决方案

问题起因最近做项目时遇到了需要多用户之间通信的问题,涉及到了WebSocket握手请求,以及集群中WebSocket Session共享的问题。期间我经过了几天的研究,总结出了几个实现分布式WebSocket集群的办法,从zuul到spring cloud gateway的不同尝试,总结出了这篇文章,希望能帮助到某些人,并且能一起分享这方面的想法与研究。以下是我的场景描述资源:4台服务器。其中只有...

weixin_39738115的博客 2634

WebSocket系列5---分布式下WebSocket Session共享解决方案

最近在做消息中心模块,想要实现消息实时推送到前端页面展示,直接摒弃了前端定时轮训调用接口来获取消息数据的方式,采用了WebSocket服务端推送。 流程是首先前端跟后端应用新建一个连接,并携带当前登录的用户ID,此时WebSocket会创建一个WebsocketSession来唯一绑定该连接,我们会在后端用Map建立用户ID与Session的映射关系: Map<String userI...

FeelTouch Labs 3127

websocket实现session共享

1.实现的逻辑 代码逻辑 2.实现的结果 视频逻辑 http://www.easyswoole.com/wstool.html websocket测试工具

zouyang920的博客 1002

SpringBoot+WebSocket+Session共享

Redis可以通过发布订阅模式、轮询机制实现消息队列。由于没有消息持久化与 ACK 的保证,所以,Redis 的发布订阅功能并不可靠。这也就导致了它的应用场景很有限,建议用于实时与可靠性要求不高的场景。

一只菜鸟夹 4254

redis解决websocket在分布式场景下session共享问题

redis解决websocket在分布式场景下session共享问题 在显示项目中遇到了一个问题,需要使用到websocket与小程序建立长链接。由于项目是负载均衡的,存在项目部署在多台机器上。这样就会存在一个问题,当一次请求负载到第一台服务器时,socketsession在第一台服务器线程上,第二次请求,负载到第二台服务器上,需要通过id查找当前用户的session时,是查找不到的。 可以看到,由于websocket的session并没有实现序列化接口。所以无法将session序列化到redis中。

weixin_45089791的博客 3122

分布式webSocket session无法共享问题

分布式webSocket session无法共享问题

qq_35031333的博客 1226
上一篇: 整理了一下八股文,有十万字,怎么背啊,JAVA太卷了,不背又不行
下一篇: 在职刷完这份481页的“Java工程师八股文”,成功卷到阿里P6offer
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值