Query service的职责
- Data ingest,将Message Queue里收到的数据导入到database里
- Table update,database里不同表的定时更新,例如数据聚合,提前计算好前端需要的表
- API handling,处理API请求,将请求需要的数据返回给前端
本文先介绍第3块。
API请求处理模块
核心模块
处理API请求的功能可以拆解为以下几个核心模块
-
Query client,这个是暴露给API用的,通过在API controller内部调用这个client,能够实现与query service的交互,并返回执行完query语句后拿到的数据
-
Query generator,这个是最核心的部分,功能就是将API的payload翻译为SQL的query语句。这里的payload包含table的report type,查询的主键,需要选择的column,filter语句,order by语句等等
-
Query executor,执行翻译好的query语句
核心数据模型
核心的数据模型有
-
Report type,也就是database里主要的几种table类型,例如operational(当天的聚合),historic(过去N天的snapshot集合)
-
表的类型,通常分为materialize view和logical view。前者就是具体存在于database中的表,而后者是逻辑上存在的临时表格,避免类似的数据重复存储在database中
-
表的定义,包括上述的1、2,以及column name,以及其他的一些metadata
-
Entity type,对于每个表格,都应该有一个entity与之对应
伪代码
public class QueryClient {
public ReportResponse GetReportAsync(ReportPayLoad payload) { ... }
}
public class QueryGenerator {
public GeneratedQuery GenerateSqlQuery(ReportPayLoad payload, ReportType rpt) { ... }
}
public class QueryExecutor {
public QueryResponse QueryReport(GeneratedQuery sqlQuery) { ... }
}
除了核心模块之外,还可以包括一些辅助模块,例如Schema manager,可以对表的schema、configuration,entity的property,qurey语句的合法性做校验。