指标引擎(微服务)

计算流程

基础指标计算


组建指标计算实体类kpiInfoVo,由KPI_INFO表字段与统计项集合List组成
  1. 根据业务类型查询**业务来源表配置[KPI_SCENE_SRC]**中的信息KpiSceneSrc
  2. 根据KpiSceneSrc的ID查询**统计项映射配置[KPI_SCENE_SRC_MAPPING]**中的信息List 对KpiSceneSrc中源表的所有字段未设置映射关系的,默认设置为原始列,加上已经配置的List,放入KpiSceneSrc
  3. KPI_INFO表中查询出需要计算的指标,从KPI_STATIS表中查询出各指标的统计项配置List,从KPI_RULE表中查询出各指标的统计规则配置List 遍历统计项配置List,获取统计项配置对应的场景下的多维结构列信息结果场景配置-场景多维结构配置[KPI_SCENE_STRUCTURE_COLUMN]
  4. 根据**统计项映射配置[KPI_SCENE_SRC_MAPPING]**中的映射关系,对结构列中的字段进行映射
  5. 解析统计规则List,获取数据日期内的统计规则
  6. 调用线程池进行计算,拼接成SQL,执行查询
    select 多维结构列[KpiSceneStructureColumnList],指标编号[kpiCode],场景编号[sceneCode],统计项列[columnCode],sum(统计项列[columnCode]) kpi_value
    from 来源表[srcTable]
    where data_date = 数据日期[dataDate] and 统计规则[List<KpiRule>]
    group by 多维结构列[KpiSceneStructureColumnList]
  7. 将结果插入到KPI_IN_VALUE的结果表中

基础指标流式计算


  1. 查询指标配置信息KpiSceneSrc,根据参数查询需要计算的指标实体类集合List,初始化进计算引擎类IKpiCalculate的属性
  2. 根据配置信息中的数据来源表获取业务数据总量sourceDataCount,并存入redis,key为KPI_SOURCE_COUNT_CALC,将已计算的业务数据总数KPI_CUMULATIVE_SOURCE_COUNT记为0
  3. 分页查询业务表数据,调用rest接口发送给引擎进行计算
    1. 引擎接收到数据,会调用异步实现方法进行计算,同时返回调用成功的消息
    2. 调用计算实现类`KpiCalculateImpl·进行计算
      1. 遍历每个统计项场景进行计算,获取指标编号、场景编号、数据日期放入计算参数中,标记这一次计算
      2. 根据统计项的统计规则过滤业务数据,再通过拼接需要group by的字段为key,统计项字段为kpiValue,组装成kpiInValueList集合
      3. kpiInValueList集合根据key放入redis缓存中,如果redis中已经存在就累加,不存在就新增
    3. 将已计算的业务数据总数KPI_CUMULATIVE_SOURCE_COUNT加上这一次计算的业务数据量
    4. 判断与业务数据总量KPI_SOURCE_COUNT_CALC是否相等,如果相等,则全部计算完成,清理redis缓存,将指标key的状态改为1
      1. 计算结束之后的业务处理没有找到,数据还只是存在redis中 (有个定时任务,会查询状态为1的redis中的数据,然后插入表中)

      2. 计算过程中的报错没有进行处理

      3. 集群部署时,数据的同步问题(的确会出现问题)

      4. 多线程、多集群下有可能有脏读的问题

解决思路:
1.根据数据批次数,各自分别维护各自计算的指标数据,在所有业务数据跑完之后,再全部汇总(对性能会有影响,主要是后面汇总的时候要大量的读取值以及写入值)
2.通过incr来控制每次只有一个线程能进入修改程序。竞争锁失败的线程,可以把失败的kpiInValue搜集起来,等最后的时候统一再更新失败的指标列表

指标附属属性计算


  1. 查询需要计算的指标计算实体类kpiInfoVo
  2. 查询系统中配置的附属属性配置Map<String, KpiAttribute>
  3. 对每个启用的场景中配置的附属属性进行计算
    1. 分析该附属属性的比较基本类型,获取该类型的对应的日期
    2. 获取数据日期各指标的指标值,转换成map
    3. 如果是基数属性
      1. 如果是基数属性,获取对应的基数时间,根据基数日期从基数结果表中获取基数值
      2. 根据基数值与指标值以及基数类型,计算出对应的指标值,插入到指标表中
    4. 如果是指标属性
      1. 根据对应的日期,查询出指标值
      2. 根据指标值与数据日期对应的指标值进行计算,插入到指标表中

手工指标计算


指标汇总


基数计算