变更数据捕获 (CDC) 是现代云原生架构的基石,能够实现实时事件驱动型应用程序。Debezium 作为领先的 CDC 平台,提供强大的单消息转换 (SMT),可在数据流到达目标之前对其进行过滤、路由和修改。

虽然 Debezium 是一个基于 Java 的项目,但许多云原生应用程序是用 Go 编写的。通过此最新增强功能,您现在可以使用 Go 编写 SMT 过滤器和路由器,使 Go 开发人员能够在一个 Java 技术中微调数据处理,这得益于 TinyGoWebAssembly

这篇博文将探讨如何在 Debezium 中使用 Go 插件,演示此功能如何增强云原生团队的灵活性和定制性。

Debezium 中的 Go SMT 过滤器和路由器

引言

变更数据捕获 (CDC) 是现代事件驱动架构的核心,它使应用程序能够实时响应数据库更改。Debezium 长期以来提供了一套强大的单消息转换 (SMT),用于在事件到达最终目的地之前进行过滤、路由和修改。但是,如果您想使用 Java 以外的语言来扩展 Debezium 的功能呢?

通过最新的增强功能,Debezium 现在允许开发人员使用 Go 编写 SMT 过滤器和路由器,为云原生应用程序开辟了新的可能性。由于 Go 在云环境中被广泛使用,这项功能使用户能够无需离开其主要开发生态系统即可自定义其 CDC 流水线。

为什么选择 Go 来实现 SMT?

Debezium 在 JVM 上运行,并且其 SMT 传统上是基于 Java 的,利用 JSR 223。这对于想要用 Groovy 或类似语言编写过滤器的 Java 开发人员来说非常方便,但许多构建云原生应用程序的团队依赖于 Go。通过这项新功能,您现在可以:

  • 使用 Go 编写 SMT 过滤器和路由器,利用其简洁性、性能和类型系统。

  • 避免 Java 依赖开销,当 Go 是您的主要语言时,您无需向类路径添加额外的 jar。

  • 更靠近您现有的 Go 基础的微服务,定制事件处理逻辑

这使得 Go 开发人员无需 Java 专业知识即可轻松地微调更改事件的过滤和路由方式。

工作原理

该集成基于 Go 插件,允许 Debezium 动态加载和执行基于 Go 的 SMT。这些插件充当轻量级、可自定义的事件处理器,在 CDC 事件到达 Kafka 或其他下游系统之前对其进行过滤和路由。

以下是一个定义简单 Go SMT 过滤器的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
        "github.com/debezium/debezium-smt-go-pdk"
)

// Example filter function
//export process
func process(proxyPtr uint32) uint32 {
        var topicNamePtr = debezium.Get(proxyPtr, "topic")
        var topicName = debezium.GetString(topicNamePtr)

        return debezium.SetBool(topicName == "mytopic")
}

func main() {}

该函数应使用 TinyGo 进行编译。

tinygo build -ldflags='-extldflags --import-memory' --no-debug -target=wasm-unknown -o filter.wasm filter.go

该函数可以作为插件加载到 Debezium 中,从而使事件处理流水线能够以 Go 语言执行自定义过滤逻辑。以下是一个实现此目标的示例配置:

transforms=filter
transforms.filter.type=io.debezium.transforms.Filter
transforms.filter.language=wasm.chicory
transforms.filter.expression=file://filter.wasm

此功能适用于哪些场景?

此功能特别适用于:

  • Go 已经是主导语言的云原生应用程序

  • 希望在没有 Java 专业知识的情况下扩展 Debezium 的团队。

  • 轻量级部署的环境,Go 的效率和对数据的惰性访问有助于降低资源使用。

展望未来

虽然此功能目前专注于基于 Go 的 SMT,但它也暗示了一个更广泛的趋势:允许 Debezium 用户将他们自己的语言引入 CDC 处理流水线。WebAssembly (Wasm) 可以进一步扩展这一概念,允许使用多种语言编写转换,同时保持可移植性和安全性。Chicory 被用作 Wasm 的零依赖 Java 运行时。

目前,如果您正在使用基于 Go 的云原生系统,并希望微调您的 CDC 流水线,Debezium 中的这项新功能是一个令人兴奋的进步。

Andrea Peruffo

我拥有近二十年的编码经验,并且充满热情地每天坚持编写代码。作为 Red Hat 的首席软件工程师,我积极参与各种开源项目,这既带来了个人成就感,也促进了职业发展。我鲜为人知的热情在于编程语言、开发工具、编译器等领域。快来您附近的某个项目中找我吧!

   


关于 Debezium

Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。

参与进来

我们希望您觉得 Debezium 有趣且有用,并希望尝试一下。在 Twitter @debezium 上关注我们,在 Zulip 上与我们聊天,或加入我们的 邮件列表 与社区交流。所有代码都在 GitHub 上开源,因此请在本地构建代码,帮助我们改进现有连接器并添加更多连接器。如果您发现问题或有改进 Debezium 的想法,请告诉我们或 记录一个问题

版权所有 © Debezium 及其作者。保留所有权利。有关我们的商标详情,请访问我们的 商标政策商标列表。第三方商标属于其各自所有者,在此提及并不表示任何认可或关联。
×