我很高兴地宣布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.class":"io.开云体育官方注册网址debezium.connector.mongodb.MongoDbConnector","tasks.max":"1","mongodb.hosts":"rs0 / mongodb: 27017","mongodb.name":"dbserver1","mongodb.user":"开云体育官方注册网址","mongodb.password":"dbz","collection.include.list":"inventory.outboxevent","开云体育电动老虎机database.history.kafka.bootstrap.servers":"卡夫卡:9092","转换":"发件箱","transforms.outbox.type":"io.开云体育官方注册网址debezium.connector.mongodb.transforms.outbox.MongoEventRouter","transforms.outbox.route.topic.replacement":"$ {routedByValue} .events","transforms.outbox.collection.expand.json.payload":"真正的","transforms.outbox.collection.field.event.timestamp":"时间戳","transforms.outbox.collection.fields.additional.placement":"类型:标题:eventType","key.converter":"org.apache.kafka.connect.storage.StringConverter","value.converter":"org.apache.kafka.connect.storage.StringConverter"}}
这里我们用MongoEventRouter
SMT用于从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消息中作为报头传播,例如允许消费者识别重复的消息。
围绕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_server","ts_ms":1559033904863,"快照":假,"db":"postgres","模式":"","表格":"","txId":556,"lsn":46523128,"xmin":零},"人事处":"米","ts_ms":1559033904961,"消息": {"前缀":"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进行规划,它将在明年的某个时候发布。开云体育官方注册网址请参加关于这个话题的讨论邮件列表。
关于Debe开云体育官方注册网址zium
开云体育官方注册网址Debezium是一个开源的分布式平台,它将现有数据库转换为事件流,因此应用程序几乎可以立即看到并响应数据库中提交的每一个行级更改。开云体育电动老虎机开云体育官方注册网址Debezium是建立在卡夫卡并提供卡夫卡连接监控特定数据库管理系统的兼容连接器。开云体育电动老虎机开云体育官方注册网址Debezium在Kafka日志中记录了数据更改的历史,所以你的应用程序可以在任何时候停止和重新启动,并且可以很容易地使用它没有运行时错过的所有事件,确保所有事件都被正确和完整地处理。开云体育官方注册网址Debezium是开源下Apache许可证,版本2.0。
参与
我们希望您觉得Debezium有趣开云体育官方注册网址且有用,并愿意尝试一下。在Twitter上关注我们@开云体育官方注册网址debezium,在Zulip上和我们聊天,或加入我们的邮件列表与社区对话。所有的代码都是开源的GitHub上,因此在本地构建代码并帮助我们改进现有连接器并添加更多连接器。如果您发现了问题或对我们如何改进Debezium有想法,请告诉我们开云体育官方注册网址记录问题。