您知道 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 传播给下游消费者。

我们计划在下周发布一篇详细的文章,其中包含使用此 Debezium 和此 Quarkus 扩展实现 outbox 模式的完整端到端示例,敬请期待。在此期间,要了解 outbox 模式,请参阅上面链接的博文或社区中的 这些 很棒的 文章

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,每个事件都包含一些定义的属性,例如 idsourcetype。实际的事件有效负载可以在 data 属性中找到,在 Debezium 的情况下,它是受影响数据库记录的旧状态和新状态的结构。大多数其他 Debezium 更改事件属性(op、时间戳、源元数据)都使用 iodebezium 前缀映射到自定义属性。

data 属性以及整个事件都可以使用 JSON 或 Avro 进行编码。最初,仅支持 CloudEvents 的“结构化模式”,即所有属性都作为事件结构的一部分,这在 Kafka 记录中是值。在未来的版本中,我们还将添加对 CloudEvents “二进制模式”的支持,其中只有 data 属性是事件结构的一部分,而所有其他属性将映射到(Kafka)头属性。

CloudEvents 支持正处于积极开发阶段,因此随着该功能的成熟,其格式的详细信息可能会在未来版本中发生变化。我们很乐意收到您对此的反馈,并从您对 CloudEvents 的见解和经验中学习。

其他更改

除了这两个较大的功能之外,Debezium 1.1 Alpha1 还进行了一些较小的改进和修复。

  • Postgres 的列值掩码,允许用星号替换敏感的列值 (DBZ-1685)

  • MySQL DDL 解析器在触发器定义 (DBZ-1699) 和 SIGNAL 关键字 (DBZ-1691) 方面有几处修复。

  • 关于时间和精度(以及精度)的两个 bug 修复 (DBZ-1688, DBZ-1707)

总共为本次发布修复了 17 个问题

非常感谢 Andrea CosentinoVasily UliankoVedit Firat ArigYongjun DuYuchao Wang 对本次发布的贡献!

接下来,我们将继续推出 Debezium 1.1 预览版本,每两到三周发布一次。请查看 路线图,了解即将推出的内容,或者与我们联系,告诉我们您的具体功能需求!

Gunnar Morling

Gunnar 是一位软件工程师,内心是一个开源爱好者,目前在 Confluent 担任技术专家。此前,他曾帮助构建一个基于 Apache Flink 的实时流处理平台,并领导了 Debezium 项目,这是一个用于变更数据捕获的分布式平台。他是 Java Champion,并创立了多个开源项目,如 JfrUnit、kcctl 和 MapStruct。Gunnar 是一位热情的博主 (morling.dev),并曾在 QCon、Java One 和 Devoxx 等各种会议上发表演讲。他居住在德国汉堡。

   


关于 Debezium

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

参与进来

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

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