您知道 1 月 16 日是 全国无事日 吗?这是全年没有庆祝、观察或纪念任何事情的一天。
嗯,通常是这样。因为我们忍不住与您分享 Debezium 1.1.0.Alpha1 发布的消息!它是在 Debezium 1.0 之后的第一个版本,并且附带了一些非常有用的功能。让我们仔细看看。
Quarkus Outbox 模式扩展
Outbox 模式 是一种很棒的方式,可以可靠且一致地让服务更新自己的数据库(例如,持久化新的订单),同时将相应的事件发布给其他服务。该模式避免了不安全的双写,也不需要分布式事务。
Debezium 已经通过其 outbox event router 支持此模式,该模式可用于将事件从一个 outbox 表流式传输到 Apache Kafka 中的不同主题。随着我们看到该模式的采用率不断增长以及该路由器的使用量增加,我们希望更进一步,并提供一个组件来简化应用程序本身内部 outbox 事件的创建。
为此,现在为 Quarkus 提供了一个 全新的扩展,Quarkus 是一个“为 OpenJDK HotSpot 和 GraalVM 量身定制的 Kubernetes 原生 Java 栈,由最优秀的 Java 库和标准构成”。使用此扩展,只需触发普通的 CDI 事件即可生成 outbox 事件。
@ApplicationScoped
public class OrderService {
@Inject
Event<ExportedEvent<?, ?>> event;
@Transactional
public PurchaseOrder addOrder(PurchaseOrder order) {
// process and persist the order...
// create a corresponding outbox event to notify other services
event.fire(OrderCreatedEvent.of(order));
return order;
}
} 事件已持久化到 outbox 表并且事务已提交后,Debezium 将捕获它并通过 Kafka 传播给下游消费者。
CloudEvents 支持
CloudEvents 是一个“描述事件数据的通用规范”,旨在提供“跨服务、平台和系统的互操作性”。通过新的 Kafka Connect 消息转换器 (io.debezium.converters.CloudEventsConverter),Debezium 现在可以 发出符合 CloudEvents 规范的更改事件。
{
"id" : "name:test_server;lsn:29274832;txId:565",
"source" : "/debezium/postgresql/test_server",
"specversion" : "1.0",
"type" : "io.debezium.postgresql.datachangeevent",
"time" : "2020-01-13T13:55:39.738Z",
"datacontenttype" : "application/json",
"iodebeziumop" : "r",
"iodebeziumversion" : "1.1.0.Alpha1",
"iodebeziumconnector" : "postgresql",
"iodebeziumname" : "test_server",
"iodebeziumtsms" : "1578923739738",
"iodebeziumsnapshot" : "true",
"iodebeziumdb" : "postgres",
"iodebeziumschema" : "s1",
"iodebeziumtable" : "a",
"iodebeziumtxId" : "565",
"iodebeziumlsn" : "29274832",
"iodebeziumxmin" : null,
"data" : {
"before" : null,
"after" : {
"pk" : 1,
"name" : "Bob"
}
}
} 借助 CloudEvents,每个事件都包含一些定义的属性,例如 id、source 和 type。实际的事件有效负载可以在 data 属性中找到,在 Debezium 的情况下,它是受影响数据库记录的旧状态和新状态的结构。大多数其他 Debezium 更改事件属性(op、时间戳、源元数据)都使用 iodebezium 前缀映射到自定义属性。
data 属性以及整个事件都可以使用 JSON 或 Avro 进行编码。最初,仅支持 CloudEvents 的“结构化模式”,即所有属性都作为事件结构的一部分,这在 Kafka 记录中是值。在未来的版本中,我们还将添加对 CloudEvents “二进制模式”的支持,其中只有 data 属性是事件结构的一部分,而所有其他属性将映射到(Kafka)头属性。
CloudEvents 支持正处于积极开发阶段,因此随着该功能的成熟,其格式的详细信息可能会在未来版本中发生变化。我们很乐意收到您对此的反馈,并从您对 CloudEvents 的见解和经验中学习。
其他更改
除了这两个较大的功能之外,Debezium 1.1 Alpha1 还进行了一些较小的改进和修复。
总共为本次发布修复了 17 个问题。
非常感谢 Andrea Cosentino、Vasily Ulianko、Vedit Firat Arig、Yongjun Du 和 Yuchao Wang 对本次发布的贡献!
接下来,我们将继续推出 Debezium 1.1 预览版本,每两到三周发布一次。请查看 路线图,了解即将推出的内容,或者与我们联系,告诉我们您的具体功能需求!
关于 Debezium
Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。