3. 数据源接入层设计:多数据源适配器、CDC实时采集、Schema Registry统一管理
数据源接入层,说白了就是实时特征平台的「入口」。
我见过不少团队,一上来就埋头写 Flink 作业,结果数据源一换、Schema 一变,整个管道就得重来。嗯,这里要提前想清楚。
跨云环境下,你的数据可能散落在 AWS RDS、阿里云 MySQL、自建 Kafka、甚至某个老旧的 Oracle 里。接入层如果不能统一抽象,后面每接一个数据源,都是噩梦。
3.1 多数据源适配器:统一接入的「万能插座」
我的习惯是,先定义一套 SourceConnector 接口。不管底层是 MySQL、PostgreSQL、MongoDB 还是 Kafka,都实现同一套 SPI。
核心接口定义:
public interface SourceConnector {
void connect(SourceConfig config);
void start(SourceEmitter emitter);
void stop();
SourceMetadata getMetadata();
}
每个数据源写一个实现类。比如:
- MysqlConnector:基于 Binlog 的 CDC 采集
- KafkaConnector:直接订阅 Topic
- MongoConnector:基于 Oplog 或 Change Stream
- HttpConnector:轮询拉取 API 数据
我在项目中遇到过一个问题:某个业务方想接入自研的消息队列,没有现成的 Connector。幸好我们提前设计了 SPI 机制,团队花了两天就写了一个适配器,完全不影响主线。
避坑指南:我曾经以为所有数据源都能「断点续传」。后来发现 MongoDB 的 Change Stream 在 failover 后可能丢数据。所以每个 Connector 必须单独实现 offset 管理,别指望统一方案。
3.2 CDC 实时采集:Binlog 与 WAL 的实战选择
CDC(Change Data Capture)是实时特征平台最核心的数据来源。你想想看,业务数据库里的用户下单、状态变更,如果不能秒级同步到特征平台,那实时特征就是空话。
目前主流的 CDC 方案就两种:
| 方案 | 原理 | 延迟 | 一致性 | 跨云适用性 |
|---|---|---|---|---|
| MySQL Binlog | 解析 binlog row-based 事件 | < 1s | Exactly-once | 需公网或专线 |
| PostgreSQL WAL | 逻辑复制槽解析 WAL | < 1s | Exactly-once | 需公网或专线 |
| Oracle LogMiner | 解析 redo log | 1-3s | At-least-once | 需公网或专线 |
| MongoDB Change Stream | 订阅 oplog | < 2s | At-least-once | 需公网或专线 |
我个人习惯用 Debezium 作为 CDC 引擎。它天然支持多种数据库,而且和 Kafka Connect 深度集成。跨云场景下,我会在每个云区域部署一个 Debezium 集群,通过专线或公网 TLS 把变更事件投递到中心 Kafka。
注意:跨云 CDC 最大的坑是网络延迟和带宽。我曾经遇到一个案例,Binlog 数据量太大,公网带宽打满,导致同步延迟从秒级飙升到分钟级。后来加了压缩和限流,才稳住。
3.3 Schema Registry:统一管理,避免「字段对不上」
数据源多了,Schema 管理就成了大问题。你想想看,MySQL 表加了个字段,下游 Flink 作业没更新,直接报错。或者两个数据源的同名字段,类型不一样,特征计算出来全是 null。
我的方案是:强制使用 Schema Registry。所有写入 Kafka 的数据,都必须注册 Schema。
推荐选型:Confluent Schema Registry(支持 Avro / Protobuf / JSON Schema)
核心流程:
- CDC 采集到数据后,先序列化为 Avro 格式
- 向 Schema Registry 注册或校验 Schema
- Kafka 消息中只带 Schema ID,不携带完整 Schema
- 消费者根据 Schema ID 反序列化
这样做的好处很明显:
- 兼容性检查:新增字段不会破坏下游
- 版本管理:可以回溯历史 Schema
- 跨云统一:所有云区域的 Schema 都指向同一个 Registry
避坑指南:我曾经在跨云场景下,把 Schema Registry 部署在单一云区域。结果另一朵云的网络抖动,导致 Schema 校验超时,整个管道阻塞。后来我改成每个云区域部署一个 Read-Only 副本,主节点只负责写,才解决。
3.4 整体架构图
下面这张图,展示了数据源接入层的核心组件和流转关系:
3.5 跨云部署要点
最后,聊几个跨云场景下的实操要点:
- 网络连通性:CDC 采集器和目标 Kafka 之间,建议走专线或 VPN。公网方案要做好 TLS 加密和 IP 白名单。
- 数据压缩:Binlog 数据量很大,我习惯在 Connector 层开启 Snappy 或 Zstd 压缩,能省 60% 带宽。
- Schema 兼容策略:我建议用 BACKWARD 模式。这样新增字段时,旧作业不会挂,新作业能读到新字段。
- 监控告警:每个 Connector 都要暴露延迟指标。我习惯设置延迟超过 10s 就告警,超过 30s 自动重启。
再次提醒:跨云 CDC 的延迟抖动是常态。不要指望「零延迟」,而是设计好「延迟容忍度」。比如用户下单特征,延迟 5 秒以内都可以接受,但风控特征必须 1 秒以内。不同特征走不同的优先级管道。