websocket多实例推送解决方案-数据实时展示
需求
需要前端展示实时的订单数据信息。如下图所示,实时下单实时页面统计更新展示

思路方案
前端使用websocket 建立通信
后端监听数据库的binglog变更,实时得到最新数据,推送到前端
现状及问题
客户端想实现实时获取数据的变更,使用了websocket+kafkaMq,当数据库变更的时候,通过mq发送变更信息到队列,服务端消费。
由于客户端与服务端websocket连接,是单台服务器建立通道,数据库变更到服务器消费,只会是其中一台服务器消费,其他服务器消费不到,导致其他服务器连接的客户端,接收不到实时的数据。


解决方案
根据以上问题,目前发现四个解决方案
|
方案名 |
描述 |
优缺点 |
改动点 |
|
redis+定时 |
当服务器A消费时,在redis里存下所需推送的全部信息 所有服务器都启动一个定时器,定时遍历redis中需要推送的,根据当前服务器socket的连接,推送对应客户端 |
优点:在消费成功以及存redis成功后,可以保证实时数据不丢失,都能推到 缺点: 有定时,伪实时,处理逻辑相对复杂 每台服务器都遍历一次所有的数据,资源浪费 |
增加定时器,在定时器里根据redis里存的实时数据,一一推送到与本服务器连接的客户端 |
|
kafka多个消费组 |
目前所有服务器都配置了同一消费组,kafka推送的时候,若是在同一分组则只推其中一个,可以考虑把每个服务器的分组按照ip+分组名来分组,形成,一个服务器是一个分组,则可以都推送到 |
优点:广播形式,推送到所有服务器,实时性有保证,消息不易丢失 缺点: 每台服务器都消费所有数据,资源浪费 |
修改基础组件,或者新写消费者代码中分组部分 |
|
rocketMq队列 |
数据库变动时,通过rocketMq队列发送消息,rocketMq支持广播形式 |
优点:广播形式,推送到所有服务器,实时性有保证,消息不易丢失 缺点: 每台服务器都消费所有数据,资源浪费 |
1、接收到数据库变更信息后,发送mq 2、增加rocketMq消费业务代码实现 |
|
redis发布订阅 |
每个服务器通过redis都订阅固定频道的消息 当某个服务器得到数据库变更时,在redis里存好实时数据,然后再在redis频道发送变更的key 所有服务器里订阅到消息后,根据key查询redis中实时数据,推送到客户端 |
优点:redis广播,实时性有保证,轻量,易实现 缺点: 每台服务器都消费所有数据,资源浪费 若redis因为网络不稳定,会导致没有订阅到,消息易丢失,不保证消息必达 |
1、增加redis订阅频道 2、消费处增加发送频道信息功能 |
方案流程图
redis+定时

kafka多个消费组

rocketMq队列

redis发布订阅

优化
根据以上方案,发现一个统一的优化点,即每台服务器都会遍历实时数据,不够精准,后期可以通过,redis和分组里加ip来,相对精准推送。。
后记
主要是提供一个思路,漏洞或许也很多,欢迎大家不吝赐教。
参考:
websocket 详解:https://blog.csdn.net/weixin_50339217/article/details/125160323
websocket 集群处理方案:https://www.cnblogs.com/yangjl01/p/12740836.html
监听数据库变化参考:
https://blog.csdn.net/Zxb654614425/article/details/129057114
https://blog.csdn.net/qq_45821251/article/details/127490460
redis 发布订阅 : https://blog.csdn.net/w15558056319/article/details/121490953
前端实时更新数据的几种方式:https://www.jianshu.com/p/b7b363e5352a
其他参考:https://blog.csdn.net/qi923701/article/details/79253779
websocket多实例推送解决方案-数据实时展示的更多相关文章
- 基于Tomcat7、Java、WebSocket的服务器推送聊天室
http://blog.csdn.net/leecho571/article/details/9707497 http://blog.fens.me/java-websocket-intro/ jav ...
- Tomcat学习总结(4)——基于Tomcat7、Java、WebSocket的服务器推送聊天室
前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前的服务器消息推送大 ...
- html5利用websocket完成的推送功能(tomcat)
html5利用websocket完成的推送功能(tomcat) 利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0.42,一些东西是自己琢磨的,也不知道恰不恰当,不恰当 ...
- 【转】SpringMVC整合websocket实现消息推送及触发
1.创建websocket握手协议的后台 (1)HandShake的实现类 /** *Project Name: price *File Name: HandShake.java *Packag ...
- 在Spring Boot框架下使用WebSocket实现消息推送
Spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的 ...
- IOS JPush 集成步骤(极光远程推送解决方案,支持android和iOS两个平台)
● 什么是JPush ● 一套远程推送解决方案,支持android和iOS两个平台 ● 它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量.开发复杂 度 ● 更多的信息,可 ...
- 学会这一招,小白也能使用数据可视化BI软件创建医院数据实时展示大屏
灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件. 本文以医院数据实时展示大屏为例 ...
- WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...
- HTML5 学习总结(五)——WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...
- HTML5 学习笔记(五)——WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...
随机推荐
- 转发:前端组件化之Monorepo方案实战
前言 在上一篇的前端组件化方案探究中,我们研究了什么是组件化以及我们为什么需要组件化.也调研和测试了一些开源项目,并且在使用.学习.研究.对比之后最终确定了以 pnpm + workspace + c ...
- 了解RTT 和RTO 对于TCP 重传的影响
前言 我们已经在很多地方了解TCP 的功能和常用字段.但是TCP 传输发生的异常情况总是让我们很棘手,不知改如何处理.陷入迷茫之中.本文章只针对RTT 和RTO 做了解. 描述 RTT (Round ...
- Java反射机制知识
modifier:修饰语 名词 JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符. 其中,该修饰符是java.lang.reflect.Modifi ...
- var 和let const的区别
var 是ES5语法,let,const是ES6语法,var存在变量提升. let const有块级作用域,var没有
- Map遍历增加key报错如何解决
public static void main(String[] args) throws Exception{ Map<String,Object> aa=new HashMap< ...
- 除select外查询数据的另一种姿势
1.24 1.[GYCTF2020]Blacklist buuctf上的题目 1.解题过程 输入1会返回一个数组,加上单引号就报错了,说明存在注入 以前做过类似的估计是堆叠注入,尝试一下 注入成功 正 ...
- 【个人首测】百度文心一言 VS ChatGPT GPT-4
昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...
- 使用LRU加速python应用
操作系统 :CentOS 7.6.1810_x64 Python 版本 : 3.9.12 一.背景描述 使用python开发过程中,会遇到需要使用缓存加速应用的情况,比如下面这些场景: 数据转换加速 ...
- 页面div垂直内容超出后,edge浏览器右侧没有自动出现滚动条
搜索网上解决办法,是给父元素添加样式 overflow-y:scroll; height:100vh; 但此举只是给该父元素侧边添加滚动条,而且不好配合回到顶部这一效果 最后发现是在父组件的包裹元素中 ...
- 迁移学习《Efficient and Robust Pseudo-Labeling for Unsupervised Domain Adaptation》
论文信息 论文标题:Efficient and Robust Pseudo-Labeling for Unsupervised Domain Adaptation论文作者:Hochang Rhee.N ...