背景

为应对更多用户使用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. 关于MySQL优化问题

    众所周知在数据量庞大的情况下普通的SQL语句已经满足不了我们的需要了,这个时候就需要DBA去进行数据库的优化,而我们作为一名开发人员不能对数据库进行优化这时该怎么办呢?答案是只能在SQL语句上面进行优 ...

  2. 利用MyFlash闪回丢失数据(续)

          last night,i've tested flashback by MyFlash tool,but failed,now let's do some other test with ...

  3. 在centos6.7通过源码安装python3.6.7报错“zipimport.ZipImportError: can't decompress data; zlib not available”

    在centos6.7通过源码安装python3.6.7报错: zipimport.ZipImportError: can't decompress data; zlib not available 从 ...

  4. Vue路由钩子 afterEach beforeEach区别

    ​ vue-router作为vue里面最基础的服务,学习一段时间,对遇到的需求进行一些总结 使用vue-cli作为开发前提 vue-router已经配置好了 路由写法 routes: [ { path ...

  5. 浅谈HTML5中canvas中的beginPath()和closePath()的重要性

    beginPath的作用很简单,就是开始一段新的路径,但在使用canvas绘图的过程中却非常重要 先来看一小段代码: var ctx=document.getElementById("can ...

  6. ASP.NET Core优化MD5加密

    MD5是我们常用的一种加密方式,但是有朋友和我说C#自带的MD5方法碰撞阻力太低,担心安全问题 然后我这里开源一下我日常使用的优化后的MD5加密方法 代码中先创建出MD5对象后对字符串先进行MD5加密 ...

  7. thinkphp5 toArray()报错

    //DB操作返回是数组.模型直接操作返回是对象 //对象类型转换数组 //打开 database.php 增加或修改参数 'resultset_type' => '\think\Collecti ...

  8. Linux下Bash shell学习笔记

    原文地址: http://www.cnblogs.com/NickQ/p/8870423.html 1.shell下没有变量类型和定义的概念. 变量直接使用不用定义 所有值都视为字符串. 在对变量取值 ...

  9. Python(9-18天总结)

    day9:函数:def (形参): 函数体 函数名(实参)形参:在函数声明位置的变量 1. 位置参数 2. 默认值参数 3. 混合 位置, 默认值 4. 动态传参, *args 动态接收位置参数, * ...

  10. JZ2440开发板:UART(串口)使用(学习笔记)

    查看UART在硬件上的信息,阅读JZ2440原理图可以看到: JZ2440开发板的UART0是可以跟USB相接的,用于打印调试,UART1,UART2两个串口用来外接模块.所以本文仅对UART0进行操 ...