背景

为应对更多用户使用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服务器多点负载均衡改造的更多相关文章

  1. Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台

    Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud

  2. 在Spring Boot框架下使用WebSocket实现消息推送

    Spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的 ...

  3. Java面试题(Spring Boot/Spring Cloud篇)

    Spring Boot/Spring Cloud 104.什么是 spring boot? SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了Spring ...

  4. spring Boot+spring Cloud实现微服务详细教程第一篇

    前些天项目组的大佬跟我聊,说项目组想从之前的架构上剥离出来公用的模块做微服务的开发,恰好去年的5/6月份在上家公司学习了国内开源的dubbo+zookeeper实现的微服务的架构.自己平时对微服务的设 ...

  5. 在Spring Boot框架下使用WebSocket实现聊天功能

    上一篇博客我们介绍了在Spring Boot框架下使用WebSocket实现消息推送,消息推送是一对多,服务器发消息发送给所有的浏览器,这次我们来看看如何使用WebSocket实现消息的一对一发送,模 ...

  6. Spring Boot/Spring Cloud、ESB、Dubbo

    如何使用Spring Boot/Spring Cloud 实现微服务应用spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现. ...

  7. 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚

    新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...

  8. 快速搭建基于Spring Boot + Spring Security 环境

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.Spring Security 权限管理框架介绍 简介: Spring Security 提供了基于 ...

  9. spring Boot+spring Cloud实现微服务详细教程第二篇

    上一篇文章已经说明了一下,关于spring boot创建maven项目的简单步骤,相信很多熟悉Maven+Eclipse作为开发常用工具的朋友们都一目了然,这篇文章主要讲解一下,构建spring bo ...

随机推荐

  1. Web—06-JavaScript

    JavaScript介绍 JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互. JavaScript是浏览器解释执行的,前端脚 ...

  2. 【oracle使用笔记1】SQL报的常见错误

    项目中使用最多的就是oracle数据库了,在实际的开发中书写SQL时遇到过许多错误,趁着现在不太忙,把之前遇到的总结一下,以后遇到的会持续更新总结. 1. ORA-00001:违反唯一约束条件 [原因 ...

  3. SSM整合时初始化出现异常

    java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException  ...

  4. html5 video获取当前时间和视频总时间长度

    html: <video id="video-active" class="video-active" width="640" hei ...

  5. ON DUPLICATE KEY UPDATE 插入or更新

    mean:若数据表中存在以相同主键的记录,就更新该条记录.否则就插入一条新的记录. 单条:INSERT INTO tablename (`field1`,`field2`) VALUES(value1 ...

  6. 微信小程序实现watch属性监听数据变化

    Vue 提供了一种通用的方式来观察和响应 Vue 实例上的数据变动:监听属性 watch. 虽然watch的滥用会导致性能不佳,但在一些情况下我们还是需要watch,使得代码更加简洁.逻辑更加清晰(其 ...

  7. 一图看懂mybatis执行过程

    一图看懂mybatis执行过程,不再懵B了

  8. 实验吧web登陆一下好吗

    知识点: 万能密码'=' 一道登陆型的SQL注入题目,这种题目一般有四种题型: 1.在username中通过union联查select一个已知字符来与传递的password匹配完成登陆 2.使用万能密 ...

  9. (杭电 1014)Uniform Generator

    Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...

  10. 四则运算_EX

    在原有四则运算基础上,除整数以外要支持真分数运算(验证正确性) 一次出的题避免相互重复 可定制出题数目 #include <stdio.h>#include <stdlib.h> ...