2、核心概念与架构设计:元数据、数据血缘、服务注册与发现、整体架构分层

好,咱们进入正题。上一章聊了为什么要做实时数据服务目录,这一章咱们把地基打牢。说白了,你得先搞清楚几个核心概念,再看整体架构怎么搭。我见过不少团队,一上来就撸代码,结果概念没对齐,架构改了三轮——嗯,那滋味不好受。

2.1 元数据:目录的灵魂

元数据是什么?就是「关于数据的数据」。你想想看,一个数据表叫什么名字、谁建的、什么时候更新的、字段类型是什么——这些都是元数据。没有元数据,你的目录就是个空壳子。

核心要点:元数据是数据目录的「骨架」和「血液」。没有它,目录无法运转。

我个人习惯把元数据分成三类:

类型 说明 举例
技术元数据 描述数据的技术属性 表结构、字段类型、分区信息、存储位置
业务元数据 描述数据的业务含义 字段中文名、业务定义、数据owner、SLA
操作元数据 描述数据的流转过程 ETL任务日志、访问记录、更新时间戳

我在项目中遇到过一个问题:技术元数据很全,但业务元数据几乎为零。结果就是,工程师知道这个表有100个字段,但没人知道「user_status」到底代表什么状态。后来我们强制要求每个字段必须有业务描述,才把坑填上。

我的建议:元数据采集要「先全后精」。先把能采的都采了,再逐步清洗和补全。别想着一步到位,那不现实。

2.2 数据血缘:追踪数据的来龙去脉

数据血缘,说白了就是「数据从哪里来,经过什么处理,最终去了哪里」。你想想看,一个报表数据对不上,你总得知道它是从哪个原始表来的吧?

我曾经接手过一个项目,数据出了问题,排查了三天才发现是上游一个ETL脚本改了字段名。如果有数据血缘,十分钟就能定位。从那以后,我坚持每个数据目录必须包含血缘信息。

数据血缘的粒度通常分三级:

  • 表级血缘:表A → 表B → 表C,知道数据流向
  • 字段级血缘:字段A1 + 字段A2 → 字段B1,精确到列
  • 任务级血缘:哪个ETL任务、什么时间、什么参数执行的转换

注意:字段级血缘采集成本很高,不是所有场景都需要。我建议先从表级做起,等团队成熟了再往下钻。

2.3 服务注册与发现:让目录「活」起来

元数据和血缘是静态的,但数据服务是动态的。今天新增一个API,明天下线一个数据源——怎么让目录实时感知这些变化?答案就是服务注册与发现。

核心机制很简单:

  1. 注册:数据服务启动时,把自己的信息(地址、端口、元数据)注册到目录
  2. 心跳:定期发送心跳,告诉目录「我还活着」
  3. 发现:消费者查询目录,找到可用的服务
  4. 注销:服务下线时,自动从目录中移除

我习惯用这样的数据结构来存储服务实例:

{
  "service_id": "ds_api_001",
  "service_name": "用户画像查询服务",
  "version": "2.1.0",
  "host": "10.0.1.100",
  "port": 8080,
  "status": "online",
  "metadata": {
    "owner": "数据平台组",
    "sla": "99.9%",
    "last_heartbeat": "2024-01-15T10:30:00Z"
  }
}

避坑指南:我曾经遇到过心跳超时设置太短,导致服务频繁上下线。建议心跳间隔设为30秒,超时阈值设为90秒,这样既及时又稳定。

2.4 整体架构分层

好,概念讲完了,咱们看看架构怎么搭。我习惯把实时数据服务目录分成三层:接入层、存储层、服务层。每一层各司其职,互不干扰。

下面这张图是我常用的架构:

实时数据服务目录 — 整体架构分层 接入层 REST API · gRPC · WebSocket · 消息队列 认证鉴权 · 限流熔断 · 协议转换 统一入口,屏蔽后端差异 服务层 元数据管理 · 血缘分析 · 服务注册与发现 搜索索引 · 数据质量检测 · 变更通知 核心业务逻辑,无状态可水平扩展 存储层 关系数据库 · 图数据库 · 搜索引擎 · 缓存 元数据持久化 · 血缘关系存储 · 全文索引 多模存储,按场景选择最优方案 数据流:客户端 → 接入层 → 服务层 → 存储层(双向读写)

2.4.1 接入层

接入层是系统的「大门」。所有客户端请求都从这里进来。我习惯用统一的API网关来做,好处是:认证鉴权、限流熔断、协议转换都可以在这一层搞定。

举个例子,有的客户端用HTTP,有的用gRPC,还有的走WebSocket。接入层负责把这些协议统一转换成内部RPC调用,后端服务完全不用关心客户端是什么。

我的经验:接入层一定要做限流。我曾经没做限流,结果一个爬虫把目录服务打挂了,整个团队被拉去复盘。现在我的接入层默认配置:单IP每秒100次请求,超了直接返回429。

2.4.2 服务层

服务层是核心。元数据管理、血缘分析、服务注册与发现、搜索索引——所有业务逻辑都在这里。这一层我要求必须无状态,这样才能水平扩展。

服务层内部我习惯拆成多个微服务:

  • 元数据服务:负责元数据的增删改查和版本管理
  • 血缘服务:负责血缘关系的构建和查询
  • 注册中心:负责服务实例的注册与发现
  • 搜索服务:负责全文索引和搜索
  • 通知服务:负责变更事件的推送

2.4.3 存储层

存储层是数据的「家」。不同数据用不同的存储,别想着一个数据库打天下。

数据类型 推荐存储 理由
元数据(结构化) PostgreSQL / MySQL 强一致性,支持事务,查询灵活
血缘关系(图结构) Neo4j / JanusGraph 图遍历效率高,血缘查询快
全文搜索 Elasticsearch 分词、模糊搜索、聚合分析
缓存 Redis 热点数据加速,降低DB压力

注意:不要把所有元数据都塞进Elasticsearch。ES适合搜索,不适合作为主存储。我见过有人把元数据全放ES,结果数据一致性出了问题,查了半天才发现是ES的最终一致性在作怪。

好了,核心概念和架构设计就聊到这儿。记住一句话:元数据是灵魂,血缘是脉络,服务注册是心跳,三层架构是骨架。把这四个东西搞清楚了,后面的实战才能走得稳。