离线报表生成规则
为什么生成离线报表
- 降低实时查询条件复杂度:如来源为3个表:订单表、核销表、退票表,从3个表中进行查询,降低为一个表。
- 提升查询数据速度:因为会进行数据纬度、数据表的合并,从而大幅度提升查询速度。
- 方便进行二次分析:可以对现有的纬度进行统计,方便的进行二次分析。
- 对现有数据进行整理
报表的表结构
- 主键:可序化(时间) + MD5(纬度)
- 纬度: 公司、地区、时间(日期、小时)
- 值字段: (累加) 如:订单数量、核销数量
增加记录到报表中(实时数据)
- 从源数据中取出数据(订单表、使用记录等等)
- 所有纬度源数据
- 部分值字段(可以只要订单数量)
- 生成纬度
- 如时间为时分秒处理为小时
- 如男女枚举,处理男女枚举名称等等
-
MQ生产者生产
-
其他模块消费者处理: addGroup
- 开启事务
- 生成主键
- 逻辑1: UPDATE ADD(UPDATE TABLE_NAME SET 值字段=值字段+@值字段 WHERE 主键=@主键),主键不存在,则insert
- 逻辑2: 通过主键加载,加载不存在,则insert值为空的数据,insert后再update ,加载存在则直接update
- 逻辑3: 通过主键加载,加载不存在,则insert,加载存在则直接update
- 这里可能会存在问题
- 流程为:MQ发送给消费者;消费者开始事务;消费者提交事务;消费者提交结束给MQ
- 假如在消费者提交结束给MQ之前,MQ死了。这时事务已经提交,却没有提交给MQ,导致MQ重启后会再次发送,则会导致报表数据重复统计,这时需要重新生成报表。
重新生成报表
为什么需要重新生成报表
- 你建立报表没有之前时间的数据。如报表开发时间为2020年5月份,我需要看到2020年1月份的数据,则需要重新生成该时间段数据。
- 报表数据错误,需要重新生成
重新生成时需要注意点
- 删除历史数据
- 生成数据时要按批次分别处理,防止数据过多,导致程序死机等各种原因。
- 因为分批次处理,那么在操作的过程中,不能再发起新的重新生成的请求。
- 一般情况下,不要重新生成今天的数据,因为实时数据会产生。
怎么重新生成
- 判断是否处于重新生成过程中。
- 第一次查询值总数,一般查询条件为:时间段内、该公司数据
- 沉睡一定时间
- 第二次查询总数
- 对比第一次和第二次总数是否发生变化.
- 发生变化,则说明还在重新生成过程中。
- 发送到MQ,开始重新生成
- MQ消费这开始处理,根据数据来源可以拆分成几个业务段。 如来源分为订单表、退单表、使用记录表,则可以拆分成如下业务段,并给指定业务段进行命名:
- 删除报表中的历史数据
- 订单查询并累加到报表中(具体数据处理业务段)
- 退单查询并累加到报表中(具体数据处理业务段)
- 使用记录并累加到报表中(具体数据处理业务段)
- 各个业务段分别处理指定的业务
- 处理完成当前业务段后,执行下个业务段。
删除业务段
删除报表中数据,如不在当前服务,则通过远程调用(如: feign)删除.
具体数据处理业务段
- 查询时间段源数据,并指定分页上线,防止查询时间过长,并指定上次查询最后1条ID防止重复查询,第一次查询时不指定上次查询ID。
- 如第一次查询100条数据,最后1条ID为100
- 第二次查询大于ID 100 的数据100条 (为什么不通过分页去查询,是防止查询的时候在增加数据,导致重复数据的产生)
- 获取最后Id
- 生成纬度数据 可以将相同纬度的数据先在内存中累加,防止发送MQ次数过多。如源数据存在3条记录:公司A 包含1个订单, 公司A包含2个订单,公司B包含1个订单,则可以整合成公司A包含3个订单,公司B包含1个订单。
- MQ生产者生产,后续参见《增加记录到报表中(实时数据)》第4步。
- 判断当前业务段是否结束,已经结束则将最后一个ID重置为空,并进行下一个业务段 ; 没有则传入最后一个ID,进行下一次处理。
- 当前业务段是否结束通过查询时间段源数据结果为空进行判断。
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2021/01/14 04:52