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

相关推荐
大迪吃小迪1 小时前
Kafka 技术问答总结文档(与RocketMQ对比)
分布式·kafka
杀死那个蝈坦1 小时前
UV 统计(独立访客统计)
java·jvm·spring·kafka·tomcat·maven
z***56562 小时前
Spring Boot集成Kafka:最佳实践与详细指南
spring boot·kafka·linq
9***Y4812 小时前
后端在分布式中的Apache Kafka
分布式·kafka
yumgpkpm12 小时前
腾讯TBDS和Cloud Data AI CMP 比较的缺陷在哪里?
hive·hadoop·elasticsearch·zookeeper·spark·kafka·hbase
小小工匠13 小时前
大规模数据处理:12_Kappa架构剖析与Kafka在大规模流式数据处理中的应用实践
架构·kafka·kappa
西岭千秋雪_13 小时前
Kafka服务端日志梳理
java·分布式·zookeeper·kafka
2501_9411481513 小时前
跨语言分布式AI平台建设与实践:Python、Java、C++、Go深度探索
kafka·rabbitmq
笨手笨脚の13 小时前
Kafka-3 Kafka 中的生产者
kafka·消息队列·事务·幂等·生产者·分区选择算法