本文由作者王改革授权网易云社区发布。
一、背景和实现目标
在开发严选数据产品(大麦商品数据运营平台和移动数据工作台VIPAPP)的时候,最多的业务场景就是对实时和离线数据模型中查询、处理、统一数据结构返回给前端。所以在开发的同时也一直在思考如何将这些相似的数据处理流程统一起来,更关注数据指标本身。
开发中经常遇到的几个问题是:
- 数据查询连接管理分散
- 模型查询结果缓存分散
- 对于模型数据查询结果缺少统一的数据变换模块支持,每日产出的实时数据指标以及离线数据指标经过后端逻辑做接口返回的时候,会有大量的get、set操作,如果同时需要计算指标同比、环比、占比、对比值等复合指标时,就会充斥大量的重复脏代码。
- 依赖的数据服务对存储在MySQL、GP、Kylin、HBase等存储引擎的数据模型暂时没有多模型的连接支持。
所以针对以上问题,我们希望能够设计出能够在数据产品中使用的通用指标查询计算模块(DPRequestManager),主要实现如下目标:
- 【数据产品通用复合指标查询计算的实践】管理数据模型查询,封装对于 统一查询服务(DQS)、MySQL等查询请求,提供查询连接池。
- 提供灵活的数据变换能力
- 能够通过配置对相应指标(包括指标值、环比、占比、同比等)自动计算,减少过多的冗余代码。
- 支持数据对象映射,减少频繁的取值和赋值操作
- 支持查询级别的缓存(可以根据系统需求自定义缓存时间、可以设定缓存条件),减少对依赖服务的查询压力。
二、通用指标查询计算模块(DPRequestManager)组织结构
文章图片
- 红色部分的并发查询器负责管理数据产品与底层数据查询存储引擎的连接,统一管理各种数据查询。DPRequestManager会作为数据产品模型查询的统一入口,封装底层数据模型存储引擎,为数据查询提供线程池服务。同时此部分还提供模型退化的能力。
- 统一缓存模块负责对数据查询做条件缓存,对于每日数据未产出或者其他情况可以对查询结果约定一些必要条件来决定是否缓存查询结果(缓存级别为请求级别)。
- 橙色部分的数据变换模块可以对DQS获取的多表数据进行灵活数据变换
- 配置模块可以对数据关系映射以及相应的复合指标计算做相应配置,统一生成结果,减少冗余代码
三、数据变换模块支持操作
对于从模型存储引擎查询结果处理成List