如何设计SQL数据库的Query Service (1) - API请求处理

255 阅读2分钟

Query service的职责

  1. Data ingest,将Message Queue里收到的数据导入到database里
  2. Table update,database里不同表的定时更新,例如数据聚合,提前计算好前端需要的表
  3. API handling,处理API请求,将请求需要的数据返回给前端

本文先介绍第3块。

API请求处理模块

核心模块

处理API请求的功能可以拆解为以下几个核心模块

  1. Query client,这个是暴露给API用的,通过在API controller内部调用这个client,能够实现与query service的交互,并返回执行完query语句后拿到的数据

  2. Query generator,这个是最核心的部分,功能就是将API的payload翻译为SQL的query语句。这里的payload包含table的report type,查询的主键,需要选择的column,filter语句,order by语句等等

  3. Query executor,执行翻译好的query语句

核心数据模型

核心的数据模型有

  1. Report type,也就是database里主要的几种table类型,例如operational(当天的聚合),historic(过去N天的snapshot集合)

  2. 表的类型,通常分为materialize view和logical view。前者就是具体存在于database中的表,而后者是逻辑上存在的临时表格,避免类似的数据重复存储在database中

  3. 表的定义,包括上述的1、2,以及column name,以及其他的一些metadata

  4. 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语句的合法性做校验。