如果我们使用 debezium,则使用 SMT/发件箱表固定模式



带有发件箱模式的Debezium

设置上下文:

  1. 我们希望使用架构注册表来存储不同业务实体的所有事件架构
  2. 一个主题可以具有同一架构的多个版本
  3. 一个主题可以具有受业务上下文约束的完全不同的架构。前客户已创建,客户电话已更新,客户地址已更新。(使用主题名称之一(
  4. 想要验证 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( |不为空 聚合 |字符变化(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 "}}"
}

}

问题:

正如您在上面的示例中所看到的,尽管有效负载包含不同的业务实体,但模式注册表/kafka 中的模式保持不变。现在,当我作为使用者尝试反序列化此消息时,我应该知道有效负载可以根据生成它们的业务事件包含不同的结构。在这种情况下,我无法充分利用模式注册表,因为消费者应该提前知道所有业务实体。

问题:

  1. 我想做的是debezium应该使用主题名称策略在同一主题"com.business.event"下创建两个不同的模式(下面的示例(。 https://karengryg.io/2018/08/18/multi-schemas-in-one-kafka-topic/

现在,当我使用消息时,作为使用者,我的使用者将从主题消息中读取架构 ID 并从架构注册表中获取它,并直接使用它解码消息。 解码后,如果我对商业事件不感兴趣,我可以忽略该消息。通过这样做,我可以使用模式注册表在同一主题下拥有不同的模式。

  1. 当我将 debezium 与模式注册表结合使用时,我可以控制 kafka 主题中的模式吗?发件箱表或发件箱模式是必须的。

请查看 https://issues.jboss.org/browse/DBZ-1297 这可能是您的问题和疑问的解决方案,因为它旨在将不透明的字符串展开到 Kafka Connect 中。在这种情况下,您将公开架构。

如果可以尝试按主题名称策略的架构,那就太好了。

最新更新