Debezium 发件箱模式 |如果我们使用 debezium,架构是用 SMT/发件箱表固定的吗
Posted
技术标签:
【中文标题】Debezium 发件箱模式 |如果我们使用 debezium,架构是用 SMT/发件箱表固定的吗【英文标题】:Debezium outbox pattern | is schema is fixed with SMT/outbox table if we use debezium 【发布时间】:2020-02-04 08:28:07 【问题描述】:带发件箱模式的 Debezium
设置上下文:
-
使用
我们想使用模式注册表来存储不同业务实体的所有事件模式
一个主题可以有多个版本的相同架构
一个主题可以有完全不同的模式,受业务上下文的限制。例如 customerCreated、customerPhoneUpdated、customerAddressUpdated。 (使用一种主题名称策略)
想验证 debezium 是否支持第 2 点和第 3 点(特别是第 3 点)。
想象一下,我有两个业务事件 customerCreated 和 orderCreated,我想将它们存储到同一个主题“com.business.event”中。
客户创建
“id”:“244444” “名称”:“测试”, “地址”:“测试 123”, “电子邮件”:“test@test.com”
订单创建
“id”:“244444” “价值”:“1234”, “地址”:“测试 123”, “电话”:“3333”, “交货日期”:“10-12-19”
我的发件箱表的结构如下文所示
https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/
专栏 |类型 |修饰符 --------------+------------+---------- - 编号 | uuid |不为空 聚合类型 |字符变化(255) |不为空 聚合ID |字符变化(255) |不为空 类型 |字符变化(255) |不为空 有效载荷 | jsonb |不为空
现在,当我将业务事件推送到上表时,它会将 customerCreated 和 orderCreated 事件作为字符串/JSON 存储到有效负载列中。如果我使用 debezium 连接器将其推送到主题“com.business.event”中的 kafka,它将产生以下消息。 (以模式打印为例)
customerCreated.json
"schema":
"type":"struct",
"fields":[
"type":"string",
"optional":false,
"field":"eventType"
,
"type":"string",
"optional":false,
"name":"io.debezium.data.Json",
"version":1,
"field":"payload"
],
"optional":false
,
"payload":
"eventType":"Customer Created",
"payload":"\"id\": \"2971baea-e5a0-46cb-b1b1-273eaf88246a\", \"name\": \"jitender\", \"email\": \"test\", \"address\": \"700 \""
orderCreated.json
"schema":
"type":"struct",
"fields":[
"type":"string",
"optional":false,
"field":"eventType"
,
"type":"string",
"optional":false,
"name":"io.debezium.data.Json",
"version":1,
"field":"payload"
],
"optional":false
,
"payload":
"eventType":"Order Created",
"payload":"\"id\": \"2971baea-e5a0-46cb-b1b1-273eaf88246a\", \"value\": \"123\",\"deliverydate\": \"10-12-19\", \"address\": \"test\", \"phone\": \"700 \""
问题:
正如您在上面的示例中所见,模式 registry/kafka 中的模式保持不变,尽管有效负载包含不同的业务实体。现在,当我作为消费者尝试反序列化此消息时,我应该知道有效负载可以包含基于它们生成的业务事件的不同结构。在这种情况下,我无法充分利用模式注册表,因为消费者应该提前了解所有业务实体。
问题:
-
我想做的是,debezium 应该使用主题名称策略在同一主题“com.business.event”下创建两个不同的模式(示例如下)。
https://karengryg.io/2018/08/18/multi-schemas-in-one-kafka-topic/
现在作为消费者,当我消费消息时,我的消费者将从主题消息中读取模式 id,并从模式注册表中获取它,并直接使用它对消息进行解码。解码后,如果我对业务事件不感兴趣,我可以忽略该消息。通过这样做,我可以使用模式注册表在同一主题下拥有不同的模式。
-
当我将 debezium 与模式注册表结合使用时,我能否控制 kafka 主题中的模式。发件箱表或发件箱图案是必须的。
【问题讨论】:
【参考方案1】:请查看https://issues.jboss.org/browse/DBZ-1297 这可能是您的问题和疑问的解决方案,因为它旨在将不透明的字符串展开到 Kafka Connect 中。在这种情况下,您将暴露架构。
如果您可以根据主题名称策略尝试架构,那就太好了。
【讨论】:
正如 Jiri 所说,目前 Debezium 尚不支持此功能,但我们肯定希望添加此功能。也许你有兴趣贡献? 问题链接好像坏了。以上是关于Debezium 发件箱模式 |如果我们使用 debezium,架构是用 SMT/发件箱表固定的吗的主要内容,如果未能解决你的问题,请参考以下文章
Spring Kafka 项目的 Debezium 发件箱错误