Debezium SchemaNameAdjuster 分析

news2024/12/17 3:37:42

Debezium SchemaNameAdjuster 分析

目录

  • 1. 概述
  • 2. 核心功能
  • 3. 实现原理
  • 4. 应用场景
  • 5. 扩展示例
  • 6. 总结

1. 概述

SchemaNameAdjuster 是 Debezium 中的一个工具类,主要用于确保 Schema 名称符合 Avro 命名规范。在数据库变更事件被转换为 Kafka 消息时,需要为每个表和字段创建相应的 Avro Schema,而这些名称必须符合 Avro 的命名规则。

2. 核心功能

  1. 名称校验

    • 检查 Schema 名称是否符合 Avro 命名规范
    • 验证首字符和非首字符的合法性
  2. 名称调整

    • 将不合法字符替换为合法字符(默认使用下划线’_')
    • 保持名称的语义性和可读性
  3. 冲突处理

    • 检测并处理名称冲突
    • 支持自定义冲突处理策略

3. 实现原理

3.1 核心接口

public interface SchemaNameAdjuster {
   
    /**
     * 调整提议的名称使其符合 Avro 命名规范
     */
    String adjust(String proposedName);
}

3.2 名称验证规则

  1. 首字符规则
public static boolean isValidFullnameFirstCharacter(char c) {
   
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_';
}
  1. 非首字符规则
public static boolean isValidFullnameNonFirstCharacter(char c) {
   
    return c == '.' || isValidFullnameFirstCharacter(c) || (c >= '0' && c <= '9');
}

3.3 调整策略

  1. 默认策略
SchemaNameAdjuster adjuster = SchemaNameAdjuster.create("_", (original, replacement, conflict) -> {
   
    LOGGER.warn("Schema name '{}' is invalid, using '{}' instead", original, replacement);
});
  1. 自定义替换
SchemaNameAdjuster customAdjuster = SchemaNameAdjuster.create(
    c -> c == '-' ? "_" : String.valueOf(c),
    (original, replacement, conflict) -> {
   
        // 自定义冲突处理逻辑
    }
);

4. 应用场景

4.1 表 Schema 构建

在构建数据库表的 Schema 时,需要为 Value Schema 和 Key Schema 生成合法的 Avro 名称:

SchemaBuilder valSchemaBuilder = SchemaBuilder.struct()
    .name(schemaNameAdjuster.adjust(schemaNamePrefix + ".Value"));
SchemaBuilder keySchemaBuilder = SchemaBuilder.struct()
    .name(schemaNameAdjuster.adjust(schemaNamePrefix + ".Key"));

4.2 CloudEvents 格式转换

在将 Debezium 事件转换为 CloudEvents 格式时,需要调整 Schema 名称:

CESchemaBuilder ceSchemaBuilder = defineSchema()
    .withName(schemaNameAdjuster.adjust(maker.ceEnvelopeSchemaName()))

4.3 逻辑表路由

在进行逻辑表路由时,需要为新的目标主题生成合法的 Schema 名称:

valueBuilder.name(schemaNameAdjuster.adjust(newTopicName + ".Value"));

4.4 心跳机制

在配置心跳机制时,需要确保心跳消息的 Schema 名称符合规范:

return new HeartbeatImpl(
    interval,
    topic,
    logicalName,
    schemaNameAdjuster);

4.5 基本用例

  1. 表名转换
String tableName = "my-table";
String adjustedName = adjuster.adjust(tableName);  // 结果: "my_table"
  1. 复杂Schema名称
String complexName = "com.example.my-schema.v2";
String adjusted = adjuster.adjust(complexName);    // 结果: "com.example.my_schema.v2"
  1. 特殊字符处理
String specialChars = "table$name@2.0";
String adjusted = adjuster.adjust(specialChars);   // 结果: "table_name_2.0"

4.6 具体Schema生成示例

让我们以一个具体的表结构为例,展示 SchemaNameAdjuster 如何处理 Schema 名称:

-- 原始表结构
CREATE TABLE inventory.products (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    description TEXT,
    weight DECIMAL(5,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ViG:图像分类领域前沿

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 图片分类任务方法概述卷积神经网络&#xff08;CNN&#xff09;视觉Transformer&#xff08;ViT&#xff09;视觉图神经网络&#xff08;ViG&a…

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省&#xff0c;就是自我反省、自我检查&#xff0c;自知己短&#xff0c;从而弥补短处、纠正过失。佛陀强调自觉觉他&#xff0c;强调以达到觉行圆满为修行的最高境界。要改正错误&#xff0c;除了虚心接受他人意见之外&#xff0c;还要不忘时时观照己身。自省自悟之…

03篇--二值化与自适应二值化

二值化 定义 何为二值化&#xff1f;顾名思义&#xff0c;就是将图像中的像素值改为只有两种值&#xff0c;黑与白。此为二值化。 二值化操作的图像只能是灰度图&#xff0c;意思就是二值化也是一个二维数组&#xff0c;它与灰度图都属于单信道&#xff0c;仅能表示一种色调…

发现一个对话框中的按钮,全部失效,点击都没有任何反应,已经解决

前端问题&#xff0c;技术vue2&#xff0c;ts。 发现一个对话框中的按钮&#xff0c;全部失效&#xff0c;点击都没有任何反应。 因为我只在template标签中加入下面这个代码&#xff0c;并没有注册。 只要有一个子组件没有注册&#xff0c;就会影响所有的按钮&#xff0c;使当前…

RT系列机器人详细介绍(BC-Z、RT-1、OMM、RT-Trajectory、Q-Transformer、RT-2、RT-X、RT-H)

目录 一、BC-Z二、RT-1三、MOO四、RT-Trajectory五、Q-Transformer六、RT-2七、RT-X八、RT-H参考文献 一、BC-Z BC-Z通过结合大规模的交互式模仿学习系统、灵活的任务嵌入和多样化的数据&#xff0c;实现了在未见任务上的零样本泛化&#xff0c;为机器人学习领域提供了一种新的…

鸿蒙系统-前端0帧起手

鸿蒙系统-前端0帧起手 先search 一番 找到对应的入门文档1. 运行项目遇到问题 如下 &#xff08;手动设计npm 的 registry 运行 npm config set registry https://registry.npmjs.org/&#xff09;2.运行后不支持一些模拟器 配置一下&#xff08;如下图&#xff0c;运行成功&am…

Redis是什么?Redis和MongoDB的区别在那里?

Redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。以下是关于Redis的详细介绍&#xff1a; 一、数据结构支持 字符串&#xff08;String&#xff09; 这是Redis最…

【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功

项目场景&#xff1a; 使用MAC电脑&#xff0c;以子账号&#xff08;非root&#xff09;的形式登录&#xff0c;连接堡垒机CLB&#xff08;传统型负载均衡&#xff09;&#xff0c;使用FileZilla&#xff08;SFTP&#xff09;进行FTP文件传输。 问题描述&#xff1a; MAC电脑…

从0到1实现vue3+vite++elementuiPlus+ts的后台管理系统(一)

前言&#xff1a;从这篇文章开始实现vue3vite的后台管理系统&#xff0c;记录下自己搭建后台系统图的过程。 这篇文章完成项目的初始化和基本配置&#xff0c;这一步可以直接跟着vue3官网进行。整个系列只有前端部分&#xff0c;不涉及后端。 vue3官网&#xff1a;https://cn.…

计算机网络错题

文章目录 码分复用透明传输差错检测停止-等待协议回退N帧协议CSMA/CD协议以太网交换机Vlanip地址的无分类编制方法ip地址的应用规划ip数据包的发送和转发过程路由信息协议IPI2016201720202022 2.5信道 码分复用 透明传输 差错检测 停止-等待协议 回退N帧协议 CSMA/CD协议 以太网…

报错:Method Not Allowed

当报错这个的时候就要注意了&#xff0c;自己的方法是否写对了&#xff01;&#xff01;&#xff01; 就像我的这个因为我的后端是put&#xff0c;所以这也是put&#xff0c;我报错就是因为这写了get&#xff0c;虽然页面是改变了&#xff0c;但是一刷新&#xff0c;就会原形毕…

IDEA 2024 版本配置热部署

在实际开发过程中&#xff0c;每次修改代码就得将项目重启&#xff0c;重新部署&#xff0c;对于一些大型应用来说&#xff0c;重启时间需要花费大量的时间成本。对于一个后端开发者来说&#xff0c;重启过程确实很难受啊 采用下面三步骤可以完成 1.在IDEA中settings中搜索Debb…

客户端(浏览器)vue3本地预览txt,doc,docx,pptx,pdf,xlsx,csv,

预览文件 1、入口文件preview/index.vue2、预览txt3、预览doc4、预览pdf5、预览pptx6、预览xlsx7、预览csv 1、入口文件preview/index.vue 预览样式&#xff0c;如pdf 文件目录如图所示&#xff1a; 代码如下 <template><div class"preview-wrap" ref&…

安卓低功耗蓝牙BLE官方开发例程(JAVA)翻译注释版

官方原文链接 https://developer.android.com/develop/connectivity/bluetooth/ble/ble-overview?hlzh-cn 目录 低功耗蓝牙 基础知识 关键术语和概念 角色和职责 查找 BLE 设备 连接到 GATT 服务器 设置绑定服务 设置 BluetoothAdapter 连接到设备 声明 GATT 回…

uniapp打包apk允许横屏竖屏内容翻转

文章目录 一、教程总结 一、教程 1.添加配置 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏反方向"landscape-secondary",//自然方向"…

ElasticSearch 常见故障解析与修复秘籍

文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高&#xff0c;read_only状态问题解决六…

Java——网络编程(上)

1 计算机网络 (作用资源共享和信息传递) (计算机网络组成——> 硬件——>计算机设备&#xff0c;外部设备&#xff0c;通信线路 软件——>网络操作系统&#xff0c;网络管理软件&#xff0c;网络通信协议) 计算机网络是指将地理位置不同的具有独立功能的多台计算机…

游戏引擎学习第50天

仓库: https://gitee.com/mrxiao_com/2d_game Minkowski 这个算法有点懵逼 回顾 基本上&#xff0c;现在我们所处的阶段是&#xff0c;回顾最初的代码&#xff0c;我们正在讨论我们希望在引擎中实现的所有功能。我们正在做的版本是初步的、粗略的版本&#xff0c;涵盖我们认…

Unix 和 Windows 的有趣比较

Unix 和 Windows NT 比较 来源于这两本书&#xff0c;把两本书对照来读&#xff0c;发现很多有意思的地方&#xff1a; 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…

攻防世界逆向刷题笔记(新手模式6-?)

6.1000clicks 看题目名字似乎是让咱们点击1000次之后才会出flag。本来打算用CE看能不能搜索出来数值&#xff0c;技术不到家&#xff0c;最后没有搜索到&#xff0c;还导致永劫无间打不了了。所以还是拿出IDA老实分析。 直接搜索flag字符&#xff0c;出来一大堆。张紫涵大佬说…