Flink CDC系列之: Kafka 数据接收器实现类KafkaDataSink
这是一个 Kafka 数据接收器实现类,负责将 CDC 事件发送到 Kafka。
类概述
java
/** A {@link DataSink} for "Kafka" connector. */
public class KafkaDataSink implements DataSink {
// 配置字段和实现方法
}
这个类实现了 Flink CDC 的 DataSink 接口,是 Kafka 连接器的核心实现。
成员变量详解
Kafka 相关配置
java
final Properties kafkaProperties; // Kafka 生产者属性
final DeliveryGuarantee deliveryGuarantee; // 交付保证
private final PartitionStrategy partitionStrategy; // 分区策略
final String topic; // 目标主题
序列化相关
java
final SerializationSchema<Event> keySerialization; // Key 序列化器
final SerializationSchema<Event> valueSerialization; // Value 序列化器
final ZoneId zoneId; // 时区信息
高级功能配置
java
final boolean addTableToHeaderEnabled; // 是否添加表信息到 Header
final String customHeaders; // 自定义 Header
final String tableMapping; // 表到主题的映射规则
构造函数
java
public KafkaDataSink(
DeliveryGuarantee deliveryGuarantee,
Properties kafkaProperties,
PartitionStrategy partitionStrategy,
ZoneId zoneId,
SerializationSchema<Event> keySerialization,
SerializationSchema<Event> valueSerialization,
String topic,
boolean addTableToHeaderEnabled,
String customHeaders,
String tableMapping) {
// 初始化所有字段
this.deliveryGuarantee = deliveryGuarantee;
this.kafkaProperties = kafkaProperties;
this.partitionStrategy = partitionStrategy;
this.zoneId = zoneId;
this.keySerialization = keySerialization;
this.valueSerialization = valueSerialization;
this.topic = topic;
this.addTableToHeaderEnabled = addTableToHeaderEnabled;
this.customHeaders = customHeaders;
this.tableMapping = tableMapping;
}
参数说明:
- 这些参数都由之前的 KafkaDataSinkFactory 创建和配置
- 体现了依赖注入的设计思想
核心方法实现
getEventSinkProvider() - 获取事件接收器提供者
java
@Override
public EventSinkProvider getEventSinkProvider() {
// 1. 创建 KafkaSink 构建器
final KafkaSinkBuilder<Event> sinkBuilder = KafkaSink.builder();
// 2. 构建并返回 FlinkSinkProvider
return FlinkSinkProvider.of(
sinkBuilder
.setDeliveryGuarantee(deliveryGuarantee) // 设置交付保证
.setBootstrapServers( // 设置 Kafka 地址
kafkaProperties
.get(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG)
.toString())
.setKafkaProducerConfig(kafkaProperties) // 设置生产者配置
.setRecordSerializer( // 设置记录序列化器
new PipelineKafkaRecordSerializationSchema(
partitionStrategy,
keySerialization,
valueSerialization,
topic,
addTableToHeaderEnabled,
customHeaders,
tableMapping))
.build());
}
关键点:
- 使用 Flink 官方的 KafkaSink 构建器
- 配置了完整的 Kafka 生产者参数
- 使用自定义的 PipelineKafkaRecordSerializationSchema 处理序列化
getMetadataApplier() - 获取元数据应用器
java
@Override
public MetadataApplier getMetadataApplier() {
return new KafkaMetaDataApplier();
}
说明:
- 返回之前介绍的 KafkaMetaDataApplier
- 对于 Schema 变更事件进行空操作
- 因为 Kafka 本身不维护 Schema
技术架构分析
与 Flink Kafka Connector 集成
java
// 使用 Flink 官方的 KafkaSink
KafkaSinkBuilder<Event> sinkBuilder = KafkaSink.builder();
优势:
- 复用 Flink 官方连接器的稳定性和功能
- 支持精确一次语义等高级特性
- 与 Flink 检查点机制深度集成
序列化架构
java
new PipelineKafkaRecordSerializationSchema(
partitionStrategy,
keySerialization, // 由 KeySerializationFactory 创建
valueSerialization, // 由 ChangeLogJsonFormatFactory 创建
topic,
addTableToHeaderEnabled,
customHeaders,
tableMapping)
设计模式:
- 策略模式: 不同的序列化格式
- 工厂模式: 序列化器的创建
- 组合模式: 多个序列化器组合工作
配置传递链
java
KafkaDataSinkFactory
→ 创建 KafkaDataSink
→ 配置 KafkaSinkBuilder
→ 使用 PipelineKafkaRecordSerializationSchema
实际工作流程
数据流处理
java
CDC Event
→ KafkaDataSink
→ PipelineKafkaRecordSerializationSchema
→ KafkaSink
→ Kafka Broker
配置示例对应的实际效果
java
# 配置示例
topic = my-topic
partition.strategy = hash-by-key
sink.add-tableId-to-header-enabled = true
sink.custom-header = source:mysql;env:prod
# 实际效果
- 所有事件发送到 "my-topic"
- 根据主键哈希选择分区
- 每个消息包含表信息的 Header
- 每个消息包含自定义 Header
扩展性设计
序列化器可插拔
java
final SerializationSchema<Event> keySerialization; // 可替换
final SerializationSchema<Event> valueSerialization; // 可替换
主题路由灵活
java
final String tableMapping; // 支持动态表到主题映射
Header 系统可扩展
java
final boolean addTableToHeaderEnabled; // 表信息 Header
final String customHeaders; // 自定义 Header
总结
KafkaDataSink 类:
- 桥接作用: 将 Flink CDC 框架与 Flink Kafka Connector 连接起来
- 配置聚合: 汇集所有配置参数,构建完整的 Kafka Sink
- 功能丰富: 支持多种序列化格式、分区策略、Header 系统等
- 生产就绪: 支持交付保证、错误处理、性能调优等生产特性
- 易于扩展: 模块化设计,便于添加新功能
它是整个 Kafka CDC 连接器的核心,负责将数据库变更事件可靠地传输到 Kafka 消息系统中。