我很高兴地宣布Debezium的发布开云体育官方注册网址1.8.0.Beta1

这个版本包含了令人兴奋的新特性,比如对MongoDB 5.0的支持、MongoDB连接器的发件箱事件路由器和对Postgres逻辑解码消息的支持,以及大量的错误修复和其他改进。总的来说,不少于63年问题已修复此版本。

让我们来仔细看看其中的一些。

MongoDB发件箱事件路由器

发件箱模式正变得越来越流行以可靠的方式在微服务之间交换数据,不使用不安全的双写到服务的数据库和Apache 开云体育电动老虎机Kafka。

使用发件箱模式,不是从实际业务表捕获更改,而是将发送给外部使用者的消息写入专用的发件箱表。这很好地将内部数据模型与用于与外部服务通信的消息契约解耦,允许您独立地开发和发展这些数据模型。对业务表的更新和对发件箱表的插入是在一个数据库事务中完成的,因此这两件事要么都完成,要么都不完成。开云体育电动老虎机一旦消息被持久化到发件箱表中,Debezium就可以从那里捕获它,并使用通常的“至少一次”语义将其传播给任何消开云体育官方注册网址费者。

开云体育官方注册网址Debezium通过特殊的单个消息转换(SMT)提供了对实现发件箱模式的支持发件箱事件路由器。这将根据表示事件所针对的聚合类型(用领域驱动设计的说法)的可配置列,负责将事件从单个发件箱表路由到不同的主题。此外,还有一种用于发出发件箱事件的扩展从使用Quarkus这是一个用于构建云原生微服务的堆栈。

这些东西现在有了新的补充事件路由它与MongoDB的Debezium连接器开云体育官方注册网址一起工作。由于MongoDB连接器的事件格式与用于关系数据库的Debezium连接器的格式不同,因此有必要创建这个单独的SMT。开云体育官方注册网址开云体育电动老虎机下面是配置SMT的示例:

的名字outbox-connector配置: {connector.classio.开云体育官方注册网址debezium.connector.mongodb.MongoDbConnectortasks.max1mongodb.hostsrs0 / mongodb: 27017mongodb.namedbserver1mongodb.user开云体育官方注册网址mongodb.passworddbzcollection.include.listinventory.outboxevent开云体育电动老虎机database.history.kafka.bootstrap.servers卡夫卡:9092转换发件箱transforms.outbox.typeio.开云体育官方注册网址debezium.connector.mongodb.transforms.outbox.MongoEventRoutertransforms.outbox.route.topic.replacement$ {routedByValue} .eventstransforms.outbox.collection.expand.json.payload真正的transforms.outbox.collection.field.event.timestamp时间戳transforms.outbox.collection.fields.additional.placement类型:标题:eventTypekey.converterorg.apache.kafka.connect.storage.StringConvertervalue.converterorg.apache.kafka.connect.storage.StringConverter}}

这里我们用MongoEventRouterSMT用于从inventory.outboxevent收集。事件可以这样写,以MongoDB CLI为例:

new_order = {"_id": ObjectId("000000000000000000000002"), "order_date": ISODate("2021-11-22T00:00:00Z"), "purchaser_id": NumberLong(1004), "quantity": 1, "product_id": NumberLong(107)} s = db.getMongo(). startsession (). starttransaction (). getdataba开云体育电动老虎机se ("inventory").orders.insert(new_order) . getdatabase ("inventory").outboxevent. outboxevent。insert({_id: ObjectId("000000000000000000000001"), aggregateid: new_order。_id, aggregatetype:“Order”,type:“OrderCreated”,时间戳:NumberLong(1556890294484),有效载荷:new_order})

请注意我们是如何在事务中插入业务集合(“orders”)和发件箱集合(“outboxevent”)的,这是MongoDB从4.0版开始支持的。在这种情况下,虽然我们在发件箱消息本身中使用实际的订单对象,但我们也可以分离这些东西,并在发件箱事件中选择另一种购买订单的表示形式。

订单的id在Kafka中用作消息键,确保与给定购买订单相关的所有发件箱事件的一致顺序。的聚合类型用于确定要将事件路由到的主题的名称,Order.events在这个例子中。独特的消息Id在Kafka消息中作为报头传播,例如允许消费者识别重复的消息。

你可以找到完整的示例使用这个新的MongoDB发件箱事件路由SMT在我们演示库。非常感谢Sungho黄他不仅提供了实际的功能实现本身,而且还创建了这个示例。

围绕Debezium MongoDB连接器的发件箱支持的潜在下一步可能是将对MongoDB的支持添加到开云体育官方注册网址Quarkus发件箱扩展中,并具有从附加到实体的子文档捕获发件箱事件的选项订单。这样,应用程序的数据和发件箱消息可以被写成一个文档(否则应用程序将忽略发件箱子文档本身),并且不需要跨文档事务。这个想法是通过dbz - 4319;如果你认为这是一个有用的补充,或者你甚至有兴趣实现它,请告诉我们。

对Postgres的支持pg_logical_emit_message ()

Postgres的多功能性和灵活性是传奇;一个有趣但鲜为人知的特性是能够将消息写入数据库的事务日志(WAL),而实际上不需要写入表。开云体育电动老虎机这是通过pg_logical_emit_message ()函数。截至Postgres 14,这些逻辑解码消息可以使用pgoutput插件,Debezium在这开云体育官方注册网址个版本中也支持这种事件类型。

逻辑解码消息非常适合传播与您的事务相关的上下文信息,而不必将这些数据存储在表中。例如,这可能是审计的元数据例如业务用户触发了一些数据更改。另一个潜在的用例是上面提到的发件箱模式,它可以在没有专用发件箱表的情况下实现,只需要将发件箱事件写入WAL即可。这是很有利的,例如,当考虑到内部管理时:在消息被传播到Kafka后,就不需要从发件箱表中删除消息。

“发送”一个逻辑解码消息就是这么简单:

选择pg_logical_emit_message (真正的some-prefix一些文本);

这将发出一个事务性消息(真正的),以“some-prefix”前缀及“some text”作为讯息内容。前缀可用于将消息分组到逻辑上下文中。开云体育官方注册网址Debezium使用前缀作为Kafka消息键,即所有具有相同前缀的消息将进入相应Kafka主题的相同分区,因此将以相同的顺序传播给下游消费者,因为它们是创建的。

逻辑解码消息由Debezium Postgres连接器使用一个新的事件类型(“m”)发出,开云体育官方注册网址看起来像这样(消息内容是二进制编码的,在本例中使用Base64):

: {版本1.8.0.Beta1连接器postgresql的名字PostgreSQL_serverts_ms1559033904863快照dbpostgres模式表格txId556lsn46523128xmin},人事处ts_ms1559033904961消息: {前缀some-prefix内容c29tZSB0ZXh0}}

消息内容是一个任意的有效负载,除了文本表示,您还可以在这里插入二进制数据。事件生成器的职责是记录格式,考虑向后兼容性来改进格式,并与任何客户机交换模式信息。这样做的一个好方法是利用模式注册表,例如Apicurio。你也可以考虑使用一个标准CloudEvents这将允许SMT(例如前面提到的发件箱事件路由器)根据事件结构中定义的属性采取行动。

要了解更多关于在Debezium中支持逻辑解码消息的信息,请参阅开云体育官方注册网址连接器的文档。非常感谢Lairen Hightower实现这个功能!

其他修复和更改

1.8.0的进一步修复和改进。Beta1版本包括:

  • 支持在Debezium UI中配置smt和主题创建设置;开云体育官方注册网址你可以在一个简短的视频中看到前者这篇文章,我们将在本周晚些时候分享另一个主题创建UI的演示

  • Vitess连接器中的事务元数据事件(dbz - 4355);我们还通过删除对VTCTLD的依赖来简化其配置(dbz - 4324),增加了对stop_on_reshard标志(dbz - 4295),并提供了指定VGTID作为流的起点的能力(dbz - 4297).所有这些变化都是由Stripe工程团队的Yang Wu和Shichao贡献的,他们同意作为这个连接器的维护者。非常感谢,欢迎!

  • Oracle Debezium连接器基于infinispan的事务缓冲区的更灵活配置(开云体育官方注册网址dbz - 4169

  • 改进的类型映射列在Postgres (dbz - 1931),时间间隔列在Oracle (dbz - 1539

  • 在使用MySQL的Debezium连接器进行增量快照时支持模式更改(开云体育官方注册网址dbz - 4196);感谢Kate Galieva的这个非常有用的改进!

详情请参阅发布说明在此版本中了解更多关于这些和进一步修复的信息。

像往常一样,非常感谢为这个版本做出贡献的每个人:

前景

随着Beta1发布,我们正在接近1.8发布周期的最后阶段。你可以期待下周的某个时间发布CR1,根据即将发布的问题报告,我们可能会决定在圣诞节前一周或2022年的第一周削减最终版本。在要添加的特性方面,我们想要做的一件事是对MongoDB连接器的增量快照支持。我们要看看这是否能在剩下的时间里实现,或者是否要等到Debezium 1.9发布。开云体育官方注册网址虽然1.8版本正在逐渐成熟,但您也可以期待Debezium 1.7.2的发布。开云体育官方注册网址

展望未来,我们还将继续围绕Debezium 2.0进行规划,它将在明年的某个时候发布。开云体育官方注册网址请参加关于这个话题的讨论邮件列表

贡纳Morling

Gunnar是Decodable的软件工程师,也是一名不折不扣的开源爱好者。多年来,他一直是Debezium的项目负责人。开云体育官方注册网址Gunnar创建了kcctl、JfrUnit和MapStruct等开源项目,并且是Bean验证2.0 (JSR 380)的规范负责人。他在德国汉堡工作。


关于Debe开云体育官方注册网址zium

开云体育官方注册网址Debezium是一个开源的分布式平台,它将现有数据库转换为事件流,因此应用程序几乎可以立即看到并响应数据库中提交的每一个行级更改。开云体育电动老虎机开云体育官方注册网址Debezium是建立在卡夫卡并提供卡夫卡连接监控特定数据库管理系统的兼容连接器。开云体育电动老虎机开云体育官方注册网址Debezium在Kafka日志中记录了数据更改的历史,所以你的应用程序可以在任何时候停止和重新启动,并且可以很容易地使用它没有运行时错过的所有事件,确保所有事件都被正确和完整地处理。开云体育官方注册网址Debezium是开源Apache许可证,版本2.0

参与

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