Wow 系统中的数据
每个聚合的历史都在事件日志中,被查询的数据从日志读出。Wow 系统基于三种模型提供查询,全部使用同一种查询语言:
| 模型 | 一条记录是 | 路由 | 用来读取 |
|---|---|---|---|
| 快照 | 聚合的最新状态,带着它的系统字段 | POST /<context>/<aggregate>/snapshot/query | 事物现在是什么样:未完成的订单、按价格排列的商品 |
| 事件流 | 聚合的一次提交,带着它的事件 | POST /<context>/<aggregate>/events/query | 发生了什么、何时发生:上周取消的订单、某个商品的价格变化 |
| 数据集 | 数仓之上一张分析用表的一行 | POST /wow/dataset/<context>/<name>/query | 跨聚合、跨服务的分析:按地区和月份统计的销售额 |
快照和事件流由拥有该聚合的服务从它自己的存储提供,提交之后即可查询。数据集从 ClickHouse Sink 根据日志填充的数仓读取,比日志稍有滞后;数据集由服务声明(从服务发布数据集),或在分析目录中定义(数据集与分析目录)。
模型接受什么
每个模型都描述自己。对它的查询路由发 GET,得到它的能力描述符:每个字段及其类型、过滤接受的操作符、能否排序、分组和聚合、查询能深入的集合,以及上限。描述符以自身的摘要作为 ETag,所以客户端可以缓存它,再用 If-None-Match 询问。查询要求模型不接受的东西时,会在运行之前被拒绝,每个违规都指明它的规则(错误)。
调用方看到什么
查询从不指明调用方的作用域,由服务来施加。每个调用方只读到自己租户的记录,在聚合保存所有者和空间时,还只读到自己所有者和空间的记录;被允许跨作用域行事的调用方,用 Wow-Scope 指明另一个作用域。数据集的行带着其主体的租户、所有者和空间,所以同样的规则在那里也成立。声明为敏感的字段,在每个回答中、对每个调用方都会被遮蔽:DISPLAY 字段仍可以过滤和排序,CONFIDENTIAL 字段则不能(身份)。
下一步
| 任务 | 阅读 |
|---|---|
| 作为分析人员过滤、分组和度量 | 分析查询 |
| 在数仓之上定义数据集,审核并发布它 | 数据集与分析目录 |
| 查找某个操作符、查询种类或错误 | 查询语言 |
| 让用户构建并保存自己的视图 | 工作台 |
| 从 TypeScript 查询 | 读取与查询 |
| 从服务中用 Kotlin 查询 | 查询快照、查询事件流 |