基于spring-boot、spring-cloud的websocket服务器多点负载均衡改造
背景
为应对更多用户使用socket的场景,准备对存放websocket的服务器进行多点搭建并配置负载均衡。
问题
服务器上了多点负载均衡以后,基于socket的部分功能发生了有规律的失效,查看后台日志发现了原因。
基于socket的功能使用的session存放在其他负载均衡的服务器上,所以在当前服务器无法实现相应操作。
举个实例,有两台加了负载的socket服务器分别为A、B。服务器A拥有用户1的socket连接即session句柄,服务器B拥有用户2的session句柄,
此时client端发送给用户1一条消息,消息内容是“kill程序员祭天消息”,由于socket服务器的负载均衡策略,该消息可能被发送到A或B服务器。
当A服务器接收到该请求时,A服务器可以完成给用户1发送消息的任务,因为A服务器拥有可以给用户1发送消息的句柄。但是服务器B接收到此消息的时候,B尝试着寻找用户1的句柄但是在列表当中没有找到该句柄,所以无法将消息发送出去,此时消息丢失了。换言服务器只能与当前建立连接的用户进行通信。
解决方案的尝试
不可行的方案
redis集中管理连接,这种方式是最开始想到的一种方式,这种方法的好处在于redis集中管理用户连接。该方法预期将用户的连接信息存放在redis服务器,当服务器接收到发送消息请求时,去redis获取与用户的连接,然后发送消息。
然而这种方法夭折了~~,问题在于session管理着与用户的长连接,该数据无法存入redis。笔者尝试着将session以HashMap、Object形式存入redis,此时redis报错。另外尝试将session以Json形式存入redis,但是在session转为Json的时候发现session是不能被序列化的,自然不能转为JSON格式了。
可行的方案
使用kafka广播形式,将消息广播到各服务器。首先将client端的请求吐入kafka,并且配置各接收服务器使用广播方式接收,即使用不同群组接收同一个topic,这样每个服务器都能接收到该请求,但是只有一个服务器可以将消息发出。该方法存在缺点但确实解决了此问题。该方法缺点在于,虽然保证的socket的负载均衡,但是服务器down掉以后,该服务器与用户的长连接就消失了。
哪路神仙有更好的方案,欢迎在评论区回复~~
基于spring-boot、spring-cloud的websocket服务器多点负载均衡改造的更多相关文章
- Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud
- 在Spring Boot框架下使用WebSocket实现消息推送
Spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的 ...
- Java面试题(Spring Boot/Spring Cloud篇)
Spring Boot/Spring Cloud 104.什么是 spring boot? SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了Spring ...
- spring Boot+spring Cloud实现微服务详细教程第一篇
前些天项目组的大佬跟我聊,说项目组想从之前的架构上剥离出来公用的模块做微服务的开发,恰好去年的5/6月份在上家公司学习了国内开源的dubbo+zookeeper实现的微服务的架构.自己平时对微服务的设 ...
- 在Spring Boot框架下使用WebSocket实现聊天功能
上一篇博客我们介绍了在Spring Boot框架下使用WebSocket实现消息推送,消息推送是一对多,服务器发消息发送给所有的浏览器,这次我们来看看如何使用WebSocket实现消息的一对一发送,模 ...
- Spring Boot/Spring Cloud、ESB、Dubbo
如何使用Spring Boot/Spring Cloud 实现微服务应用spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现. ...
- 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚
新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...
- 快速搭建基于Spring Boot + Spring Security 环境
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.Spring Security 权限管理框架介绍 简介: Spring Security 提供了基于 ...
- spring Boot+spring Cloud实现微服务详细教程第二篇
上一篇文章已经说明了一下,关于spring boot创建maven项目的简单步骤,相信很多熟悉Maven+Eclipse作为开发常用工具的朋友们都一目了然,这篇文章主要讲解一下,构建spring bo ...
随机推荐
- mongodb3.4.0复制集的搭建
本次主要介绍一下我们项目中关于mongodb复制集的搭建过程. 部署三台mongodb,分别是在69,70,71上面.71上面是主节点,69和70是从节点.使用mongodb3.4.0版本. 先看一安 ...
- javascript中sort()排序的一些理解
sort()方法对一个数组进行排序,并可以接受一个比较函数,最后返回一个排序的数组. 1.sort()有自身默认的比较函数,该函数把排序的元素都看作字符串. var s = [5, 4, 3, 2, ...
- 基于MySql和Sails.js的RESTful风格的api实现
Sails.js是类似于express的node后台框架,她面向数据库的特性使得面向数据库的服务器的搭建变得特别简单快捷. 现在网上关于Sails的教程大多是基于V0.12版本的,但是现在Sails的 ...
- Eclipse切换字体颜色
打开window-preferences
- WIN10下WNMP开发环境部署
刚刚开始学习PHP时,一直使用phpstudy,后面发现很多东西自己单独配置安装会理解更深刻,所以自己总结了一下windows下开发环境的部署教程. 以前经常在CSDN和博客园看别人的教程,今天才注册 ...
- ffmreg thinkphp 控制器 获取音频视频详细信息(获取时长)
FFmpeg下载:http://ffmpeg.zeranoe.com/builds/ 下载并解压FFmpeg文件夹: 打开你想安装的任意磁盘,例如:d盘.新建一个名为“ffmpeg”的文件夹,将第二步 ...
- 『Linux基础 - 4 』linux常用命令(1)
这篇笔记包含以下知识点: 几个概念的理解:Linux命令,控制台,终端, 终端提示符 对文件目录的操作的相关命令: 切换目录,列出目录下的文件等 对文件的操作的相关命令: 创建,删除,复制,修改,移动 ...
- Qt :undefined reference to vtable for "xxx::xxx"
现象: 类加上宏 Q_OBJECT 就会报错 :undefined reference to vtable for "xxx::xxx" 解决方法: 重新 qmake 其他情况,查 ...
- Java基础之this和super关键字用法
this 在java中,this是一个引用当前类对象的引用变量,主要有以下几种用法: 引用当前类的实例变量· this关键字可以用来引用当前类的实例变量.如果实例变量和某个方法的参数之间存在歧义(实例 ...
- python--复习之路的目录
想要看时点链接看看,常来复习,温故而知新,可以为师矣. 1:基本类型 python--基本类型之字符串 python--基本类型之列表 python--基本类型之元组 python--基本类型之集合 ...