需求

  需要前端展示实时的订单数据信息。如下图所示,实时下单实时页面统计更新展示

思路方案

  前端使用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多实例推送解决方案-数据实时展示的更多相关文章

  1. 基于Tomcat7、Java、WebSocket的服务器推送聊天室

    http://blog.csdn.net/leecho571/article/details/9707497 http://blog.fens.me/java-websocket-intro/ jav ...

  2. Tomcat学习总结(4)——基于Tomcat7、Java、WebSocket的服务器推送聊天室

    前言           HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前的服务器消息推送大 ...

  3. html5利用websocket完成的推送功能(tomcat)

    html5利用websocket完成的推送功能(tomcat) 利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0.42,一些东西是自己琢磨的,也不知道恰不恰当,不恰当 ...

  4. 【转】SpringMVC整合websocket实现消息推送及触发

    1.创建websocket握手协议的后台 (1)HandShake的实现类 /** *Project Name: price *File Name:    HandShake.java *Packag ...

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

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

  6. IOS JPush 集成步骤(极光远程推送解决方案,支持android和iOS两个平台)

    ●  什么是JPush ●  一套远程推送解决方案,支持android和iOS两个平台 ●  它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量.开发复杂 度 ●  更多的信息,可 ...

  7. 学会这一招,小白也能使用数据可视化BI软件创建医院数据实时展示大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以医院数据实时展示大屏为例 ...

  8. WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  9. HTML5 学习总结(五)——WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  10. HTML5 学习笔记(五)——WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

随机推荐

  1. vue+iview 表格行选中修改背景色

    <Table :columns="columns" :no-data-text="L('NoDatas')" border :data="lis ...

  2. Ubuntu 22.04 安装 VMWare 16.2.3 后无法启动

    异常日志: 2022-06-13T03:49:56.019Z In(05) host-29676 In file included from /tmp/modconfig-XR2GVI/vmmon-o ...

  3. arcengine标注转注记

    只是将在arcmap中添加注记的方式模拟了一遍,因此,首先显示标注(Label),而后将其转换为注记(Annotation)(Convert Label To Annotation) /******* ...

  4. 容器之beanfactory抽丝剥茧系列一

    1.总所周知,spring ioc功能实现的顶层接口就是BeanFactory.如下面类结构图 这张更加全面: 还有更加变态的 2.BeanFactory为最顶层接口,定义了最核心的需要实现的接口 p ...

  5. Python基础教程:赋值的多个方式

    一.序列解包/可迭代对象解包 释义:将一个序列(或任何可迭代的对象)解包,并将得到的值存储到一系列变量中. 1.并行赋值 >>> x,y,z = 1,2,3 >>> ...

  6. MySQL学习(四)锁机制

    分类 读锁(共享锁):对同一个数据,多个读操作可以同时进行,互不干扰 写锁(互斥锁):如果当前写操作没有完毕,则无法进行其他的读操作.写操作 操作范围 表锁:一次性对一张表整体加锁.如myisam存储 ...

  7. Jetson Xavier NX 试玩 (一)

    Jetson Xavier NX 试玩 (一) 环境搭建 0 前言 NVIDIA家的Jetson系列是业内嵌入式边缘计算机的代表作,体积小,功能强是其最主要的优点. 学院入手了一款Jeston Xav ...

  8. 微软出品自动化神器【Playwright+Java】系列(十二)测试框架的设计与开发

    一.前言 大家好,我是六哥! 又有好长一段时间没更文了,不是我懒,而是确实在更文上,没有以前积极了,这里是该自我检讨的. 其实不是我不积极,而是相对更文学习来说,优先级不是最高. 对我而言,目前最重要 ...

  9. IntelliJ IDEA 下载安装及配置使用教程(图文步骤详解)

    前言 壹哥在前面的文章中,带大家下载.安装.配置了Eclipse这个更好用的IDE开发工具,并教会了大家如何在Eclipse中进行项目的创建和代码编写.运行.但是实际上,在各种IDE开发工具中,Ecl ...

  10. 90 条简单实用的 Python 编程技巧,建议收藏

    编码原则 建议 1:理解 Pythonic 概念 -- 详见 Python 中的<Python 之禅> 建议 2:编写 Pythonic 代码 避免不规范代码,比如只用大小写区分变量.使用 ...