观察者模式实现报表实时更新

网友投稿 345 2022-09-19

观察者模式实现报表实时更新

前提

最近重构的项目涉及到很多报表的统计,重构之前报表的数据更新为每小时更新一次,这次重构过程希望可以做到实时更新,一方面可以减少测试成本,另一方面从根本上提供用户体验度。其实做实时查询,业界有很多成熟的方案,最近最常用的就是es,solr等搜索引擎,小编这次的项目数据量从零开始,短时间内容达不到那么高,其次能用技术方案解决就尽可能减少设备的投入,尽可能减少成本。

需求现状

报表的统计数据以天为维度,隔天的数据存在发生变动的可能,隔天如果存在改动则需要更新报表,而且隔天修改数据的量比较小,希望做到每天的数据都可以每小时实时更新,最好实时更新。

落地方案

在开发过程不断重构改善,迭代几个方案

1、实时从数据库中抓取,计算做到实时更新(潜在风险,系统运行一段时间可能就要用其他方案来优化)

2、保持和重构之前一样,无论哪天的数据均小时为维度更新(实现最简单,定时任务+数据缓存即可)

3、利用数据库新增统计表,隔天的数据落库保存,当天数据实时计算(效果,当前数据实时变动,隔天的数据小时维度更新)

4、利用数据库统计表+观察者模式,实现实时更新(无需考虑数据库数据量大后,系统运行缓慢问题)

小编主要说一下最后一种落地方案

隔天的数据利用观察者模式进行更新数据库统计表中数据,统计隔天的数据可以减少数据表中统计次数,避免不必要的资源浪费,报表查询利用统计数据+当前数据实时查询(当前数据量有限,数据级别可以实时查询),组合两者结果即真正的报表显示数据。

利用观察者模式实现消息订阅,监听工单保存动作(被观察者),多张报表统计(观察者),当工单数据发生变化完成保存操作后异步通知观察者,多个报表作为的观查均能收到消息,根据新旧工单,自主更新工单数据。利用观察者模式,可以降低工单数据变动和报表的耦合,而且便于扩展,新增报表时只需新增一个观察者即可。

//被观察者public class WorkOrderSubject { //观察者队列 List observerList; public void setObserverList(List observerList) { this.observerList = observerList; } public void notifyObserver(WorkOrder oldWorkOrder, WorkOrder newWorkOrder) { if (CollectionUtil.isNotEmpty(observerList) && !CallDateUtils.isToday(oldWorkOrder.getCreateTime())) { observerList.forEach(observer -> observer.updateReport(oldWorkOrder, newWorkOrder)); } }

注册者注册利用bean的xml进行注册

具体观察者

public class ReportCallAnalyseServiceImpl implements IReportCountService, IWorkOrderObserver{ /** * 定时任务每天执行一次,新增到报表中 * @return */ boolean batchInsertReport(Map timeRange,int reportDay){ //实现省略 } /** * 查询城市、坐席,渠道 报表 * @param reportWorkOrderReq * @return */ List queryReportByType(ReportReq.ReportWorkOrderReq reportWorkOrderReq){ //实现省略 } /** * 根据修改该内容自动更新 * @param oldWorkOrder * @param newWorkOrder */ void updateReport(WorkOrder oldWorkOrder, WorkOrder newWorkOrder){ //实现省略 }}

工单保存通知订阅者

public boolean saveWorkOrder(TempWorkOrder tempWorkOrder){//其他逻辑省略//异步通知订阅者taskExecutor.execute(() -> workOrderSubject.notifyObserver(oldWorkOrder, workOrder));}

总结

代码就是一个不断重构的过程,有些复杂的逻辑大部分情况不能一步到位,只有不断的迭代,重构,才能做到更好。很多内容除了想象,脚踏实地可能会更重要。

好久不写博客,都生疏了,之前每周一篇习惯,更会让人有积极向上的动力,丢掉的都会慢慢找回来的,坚信我能变成原来自己喜欢的样子。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring-bean生命周期
下一篇:【MySQL】创建普通用户,分配权限,取消权限
相关文章

 发表评论

暂时没有评论,来抢沙发吧~