📚 开源资源分享——颜佐光的个人书架
✉️ 联系站长
书架 / 数据库 / 规则

离线报表

2021-01-13 17:56 · 约 1,789 字 · 浏览 2,650 次 · 更新 2021-01-14 12:52规则

离线报表生成规则

为什么生成离线报表

  • 降低实时查询条件复杂度:如来源为3个表:订单表、核销表、退票表,从3个表中进行查询,降低为一个表。
  • 提升查询数据速度:因为会进行数据纬度、数据表的合并,从而大幅度提升查询速度。
  • 方便进行二次分析:可以对现有的纬度进行统计,方便的进行二次分析。
  • 对现有数据进行整理

报表的表结构

  • 主键:可序化(时间) + MD5(纬度)
  • 纬度: 公司、地区、时间(日期、小时)
  • 值字段: (累加) 如:订单数量、核销数量

增加记录到报表中(实时数据)

  1. 从源数据中取出数据(订单表、使用记录等等)
    - 所有纬度源数据
    - 部分值字段(可以只要订单数量)

  2. 生成纬度
    - 如时间为时分秒处理为小时
    - 如男女枚举,处理男女枚举名称等等

  3. MQ生产者生产

  4. 其他模块消费者处理: addGroup
    - 开启事务
    - 生成主键
    - 逻辑1: UPDATE ADD(UPDATE TABLE_NAME SET 值字段=值字段+@值字段 WHERE 主键=@主键),主键不存在,则insert
    - 逻辑2: 通过主键加载,加载不存在,则insert值为空的数据,insert后再update ,加载存在则直接update
    - 逻辑3: 通过主键加载,加载不存在,则insert,加载存在则直接update

  5. 这里可能会存在问题
    - 流程为:MQ发送给消费者;消费者开始事务;消费者提交事务;消费者提交结束给MQ
    - 假如在消费者提交结束给MQ之前,MQ死了。这时事务已经提交,却没有提交给MQ,导致MQ重启后会再次发送,则会导致报表数据重复统计,这时需要重新生成报表。

重新生成报表

为什么需要重新生成报表

  • 你建立报表没有之前时间的数据。如报表开发时间为2020年5月份,我需要看到2020年1月份的数据,则需要重新生成该时间段数据。
  • 报表数据错误,需要重新生成

重新生成时需要注意点

  • 删除历史数据
  • 生成数据时要按批次分别处理,防止数据过多,导致程序死机等各种原因。
  • 因为分批次处理,那么在操作的过程中,不能再发起新的重新生成的请求。
  • 一般情况下,不要重新生成今天的数据,因为实时数据会产生。

怎么重新生成

  1. 判断是否处于重新生成过程中。
    - 第一次查询值总数,一般查询条件为:时间段内、该公司数据
    - 沉睡一定时间
    - 第二次查询总数
    - 对比第一次和第二次总数是否发生变化.
    - 发生变化,则说明还在重新生成过程中。
  2. 发送到MQ,开始重新生成
  3. MQ消费这开始处理,根据数据来源可以拆分成几个业务段。
    如来源分为订单表、退单表、使用记录表,则可以拆分成如下业务段,并给指定业务段进行命名:
    - 删除报表中的历史数据
    - 订单查询并累加到报表中(具体数据处理业务段)
    - 退单查询并累加到报表中(具体数据处理业务段)
    - 使用记录并累加到报表中(具体数据处理业务段)
  4. 各个业务段分别处理指定的业务
  5. 处理完成当前业务段后,执行下个业务段。
删除业务段

删除报表中数据,如不在当前服务,则通过远程调用(如: feign)删除.

具体数据处理业务段
  1. 查询时间段源数据,并指定分页上线,防止查询时间过长,并指定上次查询最后1条ID防止重复查询,第一次查询时不指定上次查询ID。
    - 如第一次查询100条数据,最后1条ID为100
    - 第二次查询大于ID 100 的数据100条
    (为什么不通过分页去查询,是防止查询的时候在增加数据,导致重复数据的产生)
  2. 获取最后Id
  3. 生成纬度数据
    可以将相同纬度的数据先在内存中累加,防止发送MQ次数过多。如源数据存在3条记录:公司A 包含1个订单, 公司A包含2个订单,公司B包含1个订单,则可以整合成公司A包含3个订单,公司B包含1个订单。
  4. MQ生产者生产,后续参见《增加记录到报表中(实时数据)》第4步。
  5. 判断当前业务段是否结束,已经结束则将最后一个ID重置为空,并进行下一个业务段 ; 没有则传入最后一个ID,进行下一次处理。
    - 当前业务段是否结束通过查询时间段源数据结果为空进行判断。
← 返回《数据库》目录书架 →