3

websocket多实例推送解决方案-数据实时展示 - 孤王就是朕

 1 year ago
source link: https://www.cnblogs.com/minzhousblogs/p/17382884.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

websocket多实例推送解决方案-数据实时展示

需求

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

930916-20230508192427050-2063762302.png

思路方案

前端使用websocket 建立通信  

  后端监听数据库的binglog变更,实时得到最新数据,推送到前端 

现状及问题

客户端想实现实时获取数据的变更,使用了websocket+kafkaMq,当数据库变更的时候,通过mq发送变更信息到队列,服务端消费。

由于客户端与服务端websocket连接,是单台服务器建立通道,数据库变更到服务器消费,只会是其中一台服务器消费,其他服务器消费不到,导致其他服务器连接的客户端,接收不到实时的数据。

930916-20230508200902272-258373354.png
930916-20230508200902138-41776944.png

解决方案

根据以上问题,目前发现四个解决方案

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+定时

930916-20230508200902194-267602411.png

kafka多个消费组

930916-20230508200902186-323541845.png

rocketMq队列

930916-20230508200902192-2007474763.png

redis发布订阅

930916-20230508200902200-856701796.png

优化

  根据以上方案,发现一个统一的优化点,即每台服务器都会遍历实时数据,不够精准,后期可以通过,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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK