融合数据库生态:利用 EventBridge 构建 CDC 应用

引言

CDC(Change Data Capture)指的是监听上游数据变更,并将变更信息同步到下游业务以供进一步处理的一种应用场景。近年来事件驱动架构(EDA)热度逐步上升,日渐成为项目架构设计者的第一选择。EDA 天然契合 CDC 的底层基础架构,其将数据变更作为事件,各个服务通过监听自己感兴趣的事件来完成一些列业务驱动。阿里云 EventBridge 是阿里云推出的一款无服务器事件总线服务,能够帮助用户轻松快捷地搭建基于 EDA 架构的应用。近期,EventBridge 事件流已经支持了基于阿里云 DTS[1]服务的 CDC 能力。本文将从 CDC、CDC 在 EventBridge 上的应用以及若干最佳实践场景等方面,为大家介绍如何利用 EventBridge 轻松构建 CDC 应用。

CDC 概述

基本原理与应用场景

CDC 从源数据库捕获增量的数据以及数据模式变更,以高可靠、低延时的数据传输将这些变更有序地同步到目标数据库、数据湖或者其他数据分析服务。目前业界主流的开源 CDC 工具包括 Debezium[2]、Canal[3] 以及 Maxwell[4]

图片来源:https://dbconvert.com

目前业界主要有以下几类 CDC 的实现:

1. 基于时间戳或版本号

基于时间戳的方式要求数据库表有一个字段代表更新时间戳,当存在数据插入或更新时,对应时间戳字段就会随之更新。CDC 组件周期性检索更新时间大于上次同步时间的数据记录,即可捕获本周期内数据的变更。基于版本号跟踪和基于时间戳跟踪原理基本一致,要求开发者变更数据时必须更新数据的版本号。

2. 基于快照

基于快照的 CDC 实现在存储层面使用到了数据源 3 份副本,分别是原始数据、先前快照和当前快照。通过对比 2 次快照之间的差异来获取这之间的数据变更内容。

3. 基于触发器

基于触发器的 CDC 实现方式事实上是在源表上建立触发器将对数据的变更操作(INSERT、UPDATE、DELETE)记录存储下来。例如专门建立一张表记录用户的变更操作,随后创建 INSERT、UPDATE、DELETE 三种类型的触发器将用户变更同步到此表。

4. 基于日志

以上三种方式都对源数据库存在一定侵入性,而基于日志的方式则是一种非侵入性的 CDC 方式。数据库利用事务日志实现灾备,例如 MySQL 的 binlog 就记录了用户对数据库的所有变更操作。基于日志的 CDC 通过持续监听事务日志来实时获取数据库的变化情况。

CDC 的应用场景广泛,包括但不限于这些方面:异地机房数据库同步、异构数据库数据同步、微服务解耦、缓存更新与 CQRS 等。

基于阿里云的 CDC 解决方案:DTS

数据传输服务 DTS(Data Transmission Service)是阿里云提供的实时数据流服务,支持关系型数据库(RDBMS)、非关系型的数据库(NoSQL)、数据多维分析(OLAP)等数据源间的数据交互,集数据同步、迁移、订阅、集成、加工于一体。其中,DTS 数据订阅[5]功能可以帮助用户获取自建 MySQL、RDS MySQL、Oracle 等数据库的实时增量数据。

CDC 在EventBrige上的应用

阿里云 EventBridge 提供了事件总线[6]与事件流[7] 2 款不同应用场景的事件路由服务。

事件总线底层拥有事件的持久化能力,可以按照需要将事件路由到多个事件目标中。

事件流适用于端到端的流式数据处理场景,对源端产生的事件实时抽取、转换和分析并加载至目标端,无需创建事件总线,端到端转储效率更高,使用更轻便。

为了更好地支持用户在 CDC 场景下的需求,EventBridge 在事件流源端支持了阿里云 DTS 的数据订阅功能,用户仅需简单配置,即可将数据库变更信息同步到 EventBridge 事件流。

EventBridge 定制了基于 DTS sdk 的 DTS Source Connector。当用户配置事件提供方为 DTS 的事件流时,source connector 会实时地从 DTS 服务端拉取 DTS record 数据。数据拉取到本地后,会进行一定的结构封装,保留 id、operationType、topicPartition、beforeImage、afterImage 等数据,同时增加 streaming event 所需要的一些系统属性。

DTS Event 样例可参考 EventBridge 官方文档

EventBridge Streaming 保证了 DTS 事件的顺序性,但存在事件重复投递的可能性,EventId 在保证了和每条 DTS record 的一一映射关系,用户可依据此字段来对事件做幂等处理。

创建源为 DTS 的 EventBridge 事件流

下面展示如何在 EventBridge 控制台创建源为 DTS 的事件流

  • 前期准备

1. 开通 EventBridge 服务;

2. 创建 DTS 数据订阅任务;

3. 创建用于消费订阅数据的消费组账号信息。

  • 创建事件流

1. 登陆 EventBridge 控制台,点击左侧导航栏,选择“事件流”,在事件流列表页点击“创建事件流”;

2. “基本信息”中“事件流名称”与“描述”按照需要填写即可;

3. 在创建事件流,选择事件提供方时,下拉框选择“数据库 DTS”;

4. 在“数据订阅任务”一栏中选择已创建的 DTS 数据订阅任务。在消费组一栏,选择要使用哪个消费组消费订阅数据,同时填写消费组密码与初始消费时间。

5. 事件流规则与目标按照需要填写,保存启动即可创建以 DTS 数据订阅为事件源的事件流。

注意事项

使用时有以下几点需要注意:

1. EventBridge 使用的是 SUBSCRIBE 消费模式[8],所以请保证当前 DTS 消费组没有其他客户端实例在运行。如果设置的消费组在之前有运行,则传入的位点失效,会基于此消费组上次消费过的位点继续消费;

2. 创建 DTS 事件源时传入的位点仅在新消费组第一次运行时起效,后续任务重启后会基于上次消费位点继续消费;

3. EventBridge 事件流订阅 OperationType 为 INSERT、DELETE、UPDATE、DDL 类型的 DTS 数据;

4. 使用 DTS 事件源可能会有消息重复,即保证消息不丢,但无法保证仅投递一次,建议用户做好幂等处理;

5.用户如果需要保证顺序消费,则需要将异常容忍策略设置为“NONE”,即不容忍异常。在这种情况下,如果事件流目标端消费消息异常,整个事件流将暂停,直至恢复目标端正常。

最佳实践示例

基于EventBridge 实现 CQRS

在 CQRS(Command Query Responsibility Segregation)模型中,命令模型用于执行写以及更新操作,查询模型用于支持高效的读操作。读操作和写操作使用的数据模型存在一定区别,需要使用一定方式保证数据的同步,基于 EventBridge 事件流的 CDC 可以满足这样的需求。

基于云上服务,用户可以使用如下方式轻松构建基于 EventBridge 的 CQRS:

1. 命令模型操作数据库进行变更,查询模型读取 elasticsearch 获取数据;

2. 开启 DTS 数据订阅任务,捕获 DB 变更内容;

3.配置 EventBridge 事件流,事件提供方为 DTS 数据订阅任务,事件接收方为函数计算 FC;

4. FC 中的服务即为更新 elasticsearch 数据操作。

微服务解耦

CDC 也可以用于微服务解耦。例如下文是一个电商平台的订单处理系统,当有新建的未付款订单产生时,数据库会有一条 INSERT 操作,而当某笔订单状态由“未付款”变为“已付款”时,数据库会有一条 UPDATE 操作。根据订单状态变化的不同,后端会有不同的微服务来对此进行处理。

1. 用户下单/付款,订单系统进行业务处理,将数据变更写入 DB;

2. 新建 DTS 订阅任务捕获 DB 数据变更;

3. 搭建 EventBridge 事件流。事件提供方为 DTS 数据订阅任务,事件接收方为 RocketMQ;

4. 在消费 RocketMQ 数据时,同一个 topic 下启用 3 个 group 代表不同的业务消费逻辑;

a. GroupA 将捕获到的 DB 变更用户缓存更新,便于用户查询订单状态;

b. GroupB 下游关联财务系统,仅处理新建订单,即处理 DB 操作类型为 INSERT 的事件,丢弃其余类型事件;

c. GroupC 仅关心订单状态由“未付款”变为“已付款”的事件,当有符合条件事件到达时,调用下游物流、仓储系统,对订单进行进一步处理。

如果采用接口调用方式,那么用户在下单之后订单系统将分别需要调用缓存更新接口、新建订单接口以及订单付款接口,业务耦合性过高。除此之外,这种模式使得数据消费端不用担心上游订单处理接口返回内容的语义信息,在存储模型不变的情况下,直接从数据层面判断此次数据变更是否需要处理以及需要怎样的处理。同时,消息队列天然的消息堆积能力也可以帮助用户在订单峰值到来时实现业务削峰填谷。

事实上,目前 EventBridge Streaming 支持的消息产品还包括 RabbitMQ、Kafka、MNS 等,在实际操作中用户可以根据自己的需要进行选择。

数据库备份&异构数据库同步

数据库灾备和异构数据库数据同步也是 CDC 重要的应用场景。使用阿里云 EventBridge 亦可以快速搭建此类应用。

1. 新建 DTS 数据订阅任务,捕获用户 MySQL 数据库变更;

2. 搭建 EventBridge 事件流,事件提供方为 DTS 数据订阅任务;

3. 使用 EventBridge 在目的数据库执行指定 sql,实现数据库备份;

4. 数据变更事件投递到函数计算,用户业务根据数据变化内容更新对应异构数据库。

自建 SQL 审计

对于用户有自建 SQL 审计的需求,使用 EventBridge 也可以轻松实现。

1. 新建 DTS 数据订阅任务,捕获数据库变更;

2. 搭建 EventBridge 事件流,事件提供方为 DTS,事件接收方为日志服务 SLS;

3. 用户需要对 SQL 进行审计时,通过查询 SLS 进行。

总结

本文介绍了 CDC 的一些概念、CDC 在 EventBridge 上的应用以及若干最佳实践场景。随着支持产品的不断增加,EventBridge 所承载的生态版图也不断扩大,从消息生态到数据库生态,从日志生态到大数据生态,EventBridge 不断扩大其适用领域,巩固云上事件枢纽的地位,此后也将按照这个方向继续发展,技术做深,生态做广。

参考链接:

[1] DTS:

https://www.aliyun.com/product/dts

[2] Debezium:

https://debezium.io/

[3] Canal:

https://github.com/alibaba/canal

[4] Maxwell:

https://github.com/zendesk/maxwell

[5] DTS 数据订阅:

https://help.aliyun.com/document_detail/145716.html

[6] 事件总线:

https://help.aliyun.com/document_detail/163897.html

[7] 事件流:

https://help.aliyun.com/document_detail/329940.html

[8] SUBSCRIBE 消费模式:

https://help.aliyun.com/document_detail/223371.html

作者:昶风

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

Pandas+ SLS SQL:融合灵活性和高性能的数据透视

Pandas是什么 Pandas是一个十分强大的python数据分析工具,也是各种数据建模的标准工具。Pandas擅长处理数字型数据和时间序列数据。Pandas的第一大优势在于,封装了一些复杂的代码实现过程,只需要调用接口就行了,避免了编写大量的…

iLogtail 开源之路

2022年6月底,阿里云iLogtail代码完整开源,正式发布了完整功能的iLogtail社区版。iLogtail作为阿里云SLS官方标配的采集器,多年以来一直稳定服务阿里集团、蚂蚁集团以及众多公有云上的企业客户,目前已经有千万级的安装量&#xff0…

迁移 Nacos 和 ZooKeeper,有了新工具

背景 注册中心迁移在行业中主要有两个方案,一个是双注册双订阅模式(类似数据库双写),一个是 Sync 模式(类似于数据库 DTS);MSE 同时支持了两种模式,对于开通 MSE 服务治理客户&…

判断子字符串是否出现在主字符串内

//strstr(string,search)#include <stdio.h>#include <string.h>// 从str1中查找str2的个数&#xff0c;并返回int findChildCnt(char* str1, char* str2){int len strlen(str2);int cnt 0;while (str1 strstr(str1, str2)) // 如果查找到,则执行循环&#xff0…

基于 Serverless+OSS 分分钟实现图片秒变素描

场景介绍 小明接到学校老师安排的任务&#xff0c;需要批量将班级里同学们拍的普通照片转换为素描图&#xff0c;供课堂游戏使用&#xff0c;于是求助到程序员老爸&#xff0c;机智的程序员老爸分分钟用几行Python代码解决&#xff1a;在阿里云Serverless函数计算服务中部署普…

C++ Stacks(堆栈)

C Stack&#xff08;堆栈&#xff09; 是一个容器类的改编&#xff0c;为程序员提供了堆栈的全部功能&#xff0c;——也就是说实现了一个先进后出&#xff08;FILO&#xff09;的数据结构。 操作比较和分配堆栈empty()堆栈为空则返回真pop()移除栈顶元素push()在栈顶增加元素…

解析 RocketMQ 业务消息 - “顺序消息”

引言 Apache RocketMQ 诞生至今&#xff0c;历经十余年大规模业务稳定性打磨&#xff0c;服务了阿里集团内部业务以及阿里云数以万计的企业客户。作为金融级可靠的业务消息方案&#xff0c;RocketMQ 从创建之初就一直专注于业务集成领域的异步通信能力构建。本篇将继续业务消息…

C++ Lists(链表)

Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除&#xff0c;但是随机访问却比较慢. assign()给list赋值back()返回最后一个元素begin()返回指向第一个元素的迭代器clear()删除所有元素empty()如果list是空的则返回trueend()返回末尾的迭代器e…

Koordinator 0.6:企业级容器调度系统解决方案,引入 CPU 精细编排、资源预留与全新的重调度框架

阿里云原生开源的混部系统 Koordinator 基于阿里超大规模混部生产实践经验而来&#xff0c;旨在为用户打造云原生场景下接入成本最低、混部效率最佳的解决方案&#xff0c;助力用户企业实现云原生后提升计算资源利用率、降低 IT 成本。 经过社区多位成员的贡献&#xff0c;Koor…

KubeVela Maintainer 徐佳航:什么样的开源项目将具有可延续的生命力?

云原生的技术价值喻示着它就是未来&#xff0c;加入到一个具有可延续性生命力的开源社区&#xff0c;可以帮助我们更快地到达那里。——徐佳航&#xff0c;KubeVela Maintainer&#xff0c;来自招商银行基础设施研发中心云平台及运维平台开发团队。来自招商银行基础设施研发中心…

C++ Queues(队列)

C队列是一种容器适配器&#xff0c;它给予程序员一种先进先出(FIFO)的数据结构。 back()返回最后一个元素empty()如果队列空则返回真front()返回第一个元素pop()删除第一个元素push()在末尾加入一个元素size()返回队列中元素的个数

龙蜥社区首推“分层分类”顶设 发展以云为终态的开源产业创新生态

在刚刚结束的 2022 开放原子全球开源峰会 OpenAnolis 分论坛上&#xff0c;龙蜥社区技术委员会主席杨勇做了《OpenAnolis 社区技术发展报告》的主题演讲&#xff0c;分享龙蜥社区如何从 0 到 1 实现原生社区布局&#xff0c;以及发展以云为终态的开源产业创新生态。 全文整理如…

友邦人寿可观测体系设计与落地

业务场景与挑战 友邦保险是香港联合交易所上市的人寿保险集团&#xff0c;覆盖 18 个市场。截至 2021 年 12 月 31 号&#xff0c;总资产 3400 亿美元。 友邦保险于 1992 年在上海设立分公司&#xff0c;是改革开放后最早一批获发个人人身保险业务营业执照的非本土保险机构之…

如何写出有效的单元测试

什么是单元测试 《单元测试的艺术》中对单元测试的定义&#xff1a; 一个单元测试是一段自动化的代码&#xff0c;这段代码调用被测试的工作单元&#xff0c;之后对这个单元的单个最终结果的某些假设进行校验。 单元测试几乎都是用单元测试框架编写的&#xff1b;只要产品代…

测试环境不稳定复杂的必然性及其对策

这篇文章想要讲的&#xff0c;的确是两件事情&#xff1a; 为什么测试环境的不稳定是必然的&#xff0c;怎么让它尽量稳定一点&#xff1f;为什么测试环境比生产环境更复杂&#xff0c;怎么让它尽量简单一点&#xff1f; 此外&#xff0c;还会谈一谈对测试环境和生产环境的区别…

【计算几何】线段相交

问题描述&#xff1a;已知两条线段P1P2和Q1Q2&#xff0c;判断P1P2和Q1Q2是否相交&#xff0c;若相交&#xff0c;求出交点。 两条线段的位置关系可以分为三类&#xff1a;有重合部分、无重合部分但有交点、无交点。 算法的步骤如下&#xff1a; 1.快速排斥实验。 设以线段…

代码圈复杂度治理小结

网上有个段子&#xff0c;说建筑工程师不会轻易答应会给摩天大楼增加一个地下室&#xff0c;但代码开发工程师却经常在干这样的事&#xff0c;并且总有人会对你说“这个需求很简单”。到土里埋个雷&#xff0c;这确实不复杂&#xff0c;但我们往往面临的真实场景其实是“在一片…

向量的叉积

向量的叉积性质都忘完了……但是它可以用来判断点在直线的某侧。进而可以解决点是否在三角形内&#xff0c;两个矩形是否重叠等问题。向量的叉积的模表示这两个向量围成的平行四边形的面积。 设矢量P ( x1, y1 )&#xff0c;Q ( x2, y2 )&#xff0c;则矢量叉积定义为由(0,0)…

MSE 治理中心重磅升级-流量治理、数据库治理、同 AZ 优先

本次 MSE 治理中心在限流降级、数据库治理及同 AZ 优先方面进行了重磅升级&#xff0c;对微服务治理的弹性、依赖中间件的稳定性及流量调度的性能进行全面增强&#xff0c;致力于打造云原生时代的微服务治理平台。 前情回顾 在介绍升级能力之前&#xff0c;先简要回顾 MSE 产…

1801 不重复的三位数

1801 不重复的三位数 Time Limit : 1000 MS | Memory Limit : 65536 KBSubmits : 16 | Solved : 4 Description 给定一个正整数n&#xff0c;则1,2,...,n这n个数字能组成多少个互不相同且无重复数字的三位数。Input 输入一个正整数n ( 3 < n < 9 )。Output 先输出三位数的…