曾经参与的数据实时提醒的一种设计回顾

2024-06-12 23:32

本文主要是介绍曾经参与的数据实时提醒的一种设计回顾,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景描述:这一篇说到指挥平台基本都是统计,大部分统计都是前一天的数据,也有一些统计是要求实.时的,今日动态就是实时统计中的一种:显示一些业务新增的记录数和记录信息

设计分为两部分,一部分是提供数据,一部分是查询数据

提供数据:通过Schedule线程池定时调度各业务查询实现,查询新增的数据,然后插入实时数据中间表

查询数据:维持一个SseEmitter连接

由一个线程通过EventStream实时向前端推送

SseEmitter发送数据

 

1.提供数据大概的实现过程

大概过程是各业务实现事件抽取接口,查询新增的数据,由一个抽取器调用,向Redis写数据,然后再从Redis里面拿数据向实时数据表写入

1.1 业务事件抽取器

抽取指定范围内的业务事件

1.2 事件Poll器

Scheduled线程池定时抽取

初始化Bean后,afterPropertiesSet 

获取所有实现的抽取器

然后分桶,通过线程池定时调度。map的key是桶号,value是对应的抽取器集合 

对于每一个抽取器,通过线程池调度

ExtractJob实现Runnable方法

 

 run方法

下面就执行抽取

1.3 从redis将动态消息抽取到实时数据表

也是维护了一个Scheduled线程池

afterPropertiesSet设置这个线程池

从Redis读取

2.查询数据大概的实现过程

大概过程是这样

2.1 维护客户端队列和数据提供器无界队列

2.2 数据提供器supplier查询数据 

 

 2.3 向客户端推送

 SseEmitter.event的数据由SseEmitterHolder提供,在初始化客户端时调用init方法,调用supplier的方法

思考和讨论:

1.这里用到了Scheduled线程池线程池,什么时候可以用Scheduled线程池?

在需要定时调度的场景下可以考虑Scheduled线程池,并且是要可以自己接管的。咱们说的分布式调度框架一般不能自己接管调用过程、结果等。这是我的思考。

2.为什么提供数据和查询数据要分开

这个我觉得要实现数据实时展示其实是一个复杂的过程,首先要确定数据来源再是数据如何展示,将提供数据和查询数据分开也是一种解耦,出问题时可以从两个方面去排查,如果在一个过程连续完成,局面有点太大了,就有点面向结构化(过程)的设计了,不太符合面向对象的设计。

3.为什么数据要先放到Redis

我觉得主要是因为要展示的数据格式和查询出的数据要做转换,Redis作为缓存或内存数据库,在这里起到内存数据库的作用,是一个中间层,起到承上启下的作用。

4.hash code不和保证唯一性

这里是通过Hashing.murmur3_128实现,不是很了解

这里的目的是为了比较事件间的hash值来增量添加而不是全量添加,这一块没有深入debug过,感觉是那么回事但不是很确定。通过事件的hash和redis记录的hash比较判断当前事件是否需要更新

这个过程挺复杂的,如果要自己设计,照葫芦画瓢或许可以,但核心是设计思路和为什么要这么设计,现在是别人实现了去看,自己设计并实现的过程中肯定会遇到很多问题,这也是必须要经历的过程。

以上思考都是个人观点,也主要是给自己看看,有疑问的朋友欢迎一起讨论。

这篇关于曾经参与的数据实时提醒的一种设计回顾的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055647

相关文章

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口