写点什么

Debezium:基于 Kafka 的 CDC 事件流解决方案

2019 年 4 月 14 日

Debezium:基于Kafka的CDC事件流解决方案

在将数据保存到数据库中时,一般也会往缓存或搜索引擎里保存一份。这里的挑战在于如何在绕开分布式事务和双重写入的情况下保持数据的同步。一种方式是借助变更数据捕获(Change Data Capture,CDC)工具捕获数据变更,并将其发布到数据库中。在柏林举行的 MicroXchg 大会上,Gunnar Morling 介绍了Debezium,一种借助 Kafka 将数据变更发布成事件流的 CDC 实现。


Morling 是红帽公司的一名工程师,他分享的 Debezium 是一款开源的、基于 Kafka 的 CDC 工具,它会读取数据库事务日志,并将其发布成事件流。其他应用程序按照正确的顺序异步消费这些事件,然后根据实际需求更新自己的数据存储。


数据库的事务日志文件是一种仅追加模式的日志文件,用于进行回滚和复制。在 Morling 看来,这种日志是理想的数据库数据变更来源,因为它们包含了所有的数据变更以及变更发生的顺序。所有数据库都提供了用于读取这种日志文件的 API,所以 Debezium 内置几种数据库连接器。Debezium 会在输出端生成通用的 Kafka 抽象表示。


CDC 除了可以用来更新缓存、服务和搜索引擎,Morling 还介绍了其他几种用例,包括:


  • 数据复制,通常用来将数据复制到其他类型的数据库或数据仓库中。

  • 审计。因为保留了数据历史,在使用元数据填充数据后,可以实现数据变更审计。


在基于微服务的系统中,其中服务通常需要来自其他服务的数据。不过 Morling 表示,最好要避免在服务间共享数据库,而使用 REST 调用会增加服务间的耦合性。在这种情况下,我们可以使用 CDC。我们将数据变更创建为事件流,其他服务可以订阅这些流,并更新它们的本地数据库。因为事件管道是异步的,在发生网络问题时,允许服务滞后处理变更,但最终会追赶上来——系统是最终一致性的。


Morling 指出,暴露内部结构其实是有问题的(之前的例子),但这个问题可以通过”发件箱“(outbox)模式来解决。我们会使用单独的事件表,而不是直接捕获由业务领域所使用的表数据变更。当领域发生变更时,需要在同一事务中向事件表中发布一条数据。这个事件表就是发件箱,其中包含了需要发送到其他系统的事件。


在开始采用微服务架构之前,一般会有一个需要拆解成微服务的单体。Morling 表示,为了验证拆解出来的服务是否正确,可以使用 CDC。将写入请求保持在单体上,然后捕获变更,然后用它们来验证新服务的行为是否正确。


Morling 在另一篇博文中详细介绍了发件箱模式。Martin Kleppmann 在之前的一篇博文中介绍了如何使用日志来构建健壮的基础设施以及为什么说双重写入是一种很糟糕的做法。


更多有关大会演讲的内容将在未来几个月陆续提供


查看英文原文Creating Events from Databases Using Change Data Capture: Gunnar Morling at MicroXchg Berlin


2019 年 4 月 14 日 08:008923
用户头像

发布了 731 篇内容, 共 368.6 次阅读, 收获喜欢 1860 次。

关注

评论

发布
暂无评论
发现更多内容

面试官:你说你懂i++跟++i的区别,那你知道下面这段代码的运行结果吗?

程序员DMZ

JVM i++

如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

程序员DMZ

spring 生命周期

关于日期及时间字段的查询

Simon

MySQL sql查询

别人家的 DevOps 流水线,价值一个亿

Atlassian

DevOps 数字化转型 金融 Jira 数字银行

MySQL索引问题探究手记

架构精进之路

MySQL 索引

面试必杀技,讲一讲Spring中的循环依赖

程序员DMZ

spring

枚举算法练习例题(Python版)

罗罗诺亚

Python 算法 枚举

集成学习方法及应用,破解AI实践难题

博文视点Broadview

人工智能 学习 AI 周志华

一个数据库管理员的自我救赎之路

华为云开发者社区

数据库 华为云 数据库迁移 企业上云 DRS

区块链、人工智能……警惕非法金融借创新概念迷惑投资人

CECBC区块链专委会

区块链 金融

MySQL5.7升级到8.0过程详解

Simon

MySQL

低/零代码干掉了传统的开发模式

代码制造者

编程语言 低代码 零代码 信息化 编程开发

实践案例丨教你一键构建部署发布前端和Node.js服务

华为云开发者社区

node.js 后端 服务器 代码 华为云鲲鹏

MySQL关于日期为零值的处理

Simon

MySQL

云上安全工作乱如麻,等保2.0来一下

华为云开发者社区

安全 华为云 等保 云平台 多云服务

spring Cloud Eureka Rest接口重写

xcbeyond

Java SpringCloud Eureka

恢复青春气息,就靠这套人像美肤算法了

博文视点Broadview

算法 计算机视觉 图像识别 人像

SpringCloud服务注册中心双节点集群(Eureka集群)

xcbeyond

Java 架构 微服务 Eureka 集群

SWARM学习1——Kademlia分布式路由表协议

AIbot

区块链 DHT 分布式存储 分布式文件存储 分布式路由

海量并发也没那么可怕,运维准点下班全靠它!

华为云开发者社区

容器 网络 并发 华为云 裸金属容器

操作系统bochs安装及使用

allworldg

操作系统

是时候学习Linux了

Simon

Linux

自从有了语音开黑小能手,队友再也不会骂我了!

anyRTC开发者

WebRTC 在线教育 直播 RTC RTMP

我的敏捷历程 —— 兼评《敏捷整洁之道 - 回归本源》

FollowFlow

敏捷开发 Agile 极限编程 XP

如何利用k8s拉取私有仓库镜像

Damon

Docker k8s

钓鱼网站:详解hosts文件

xcbeyond

Java 域名解析 hosts

Java-技术专题-synchronized关键字

李浩宇/Alex

易观郭炜:流动水系数造未来

易观大数据

写作只是消遣?

Geek_db1689

写作 讨论写作 自我感悟 瞎想乱写

CRM往事丨三件事,所有SaaS的缩影

人称T客

跨域问题(CORS / Access-Control-Allow-Origin)

xcbeyond

Java CORS 跨域

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Debezium:基于Kafka的CDC事件流解决方案-InfoQ