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 消息系统中。

相关推荐
太阳伞下的阿呆11 小时前
kafka高吞吐持久化方案(2)
分布式·kafka·高并发·重入锁
Chasing__Dreams18 小时前
kafka--基础知识点--19--消息重复
分布式·kafka
import_random2 天前
[kafka]伪集群搭建,各个节点配置文件中listeners参数的配置
kafka
Mr.朱鹏2 天前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
山沐与山3 天前
【MQ】Kafka与RocketMQ深度对比
分布式·kafka·rocketmq
yumgpkpm3 天前
Cloudera CDP7、CDH5、CDH6 在华为鲲鹏 ARM 麒麟KylinOS做到无缝切换平缓迁移过程
大数据·arm开发·华为·flink·spark·kafka·cloudera
树下水月3 天前
Easyoole 使用rdkafka 进行kafka的创建topic创建 删除 以及数据发布 订阅
分布式·kafka
Cat God 0073 天前
基于Docker搭建kafka集群
docker·容器·kafka
Cat God 0073 天前
基于 Docker 部署 Kafka(KRaft + SASL/PLAIN 认证)
docker·容器·kafka