带有发件箱模式的Debezium
设置上下文:
想象一下,我有两个业务事件customerCreated和orderCreated,并且我想将它们都存储在同一主题“ com.business.event”中。
customerCreated
{ “ id”:“ 244444” “名称”:“测试”, “地址”:“测试123”, “电子邮件”:“ test@test.com” }
orderCreated
{ “ id”:“ 244444” “值”:“ 1234”, “地址”:“测试123”, “电话”:“ 3333”, “交货日期”:“ 10-12-19” }
我的发件箱表的结构如下文
https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/
列|类型修饰符 -------------- + ------------------------ + ---------- -- id | uuid |不为空 聚合类型|字符变化(255)|不为空 聚合|字符变化(255)|不为空 类型字符变化(255)|不为空 有效载荷jsonb |不为空
现在,当我将业务事件推送到上表时,它将把customerCreated和orderCreated事件作为String / 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中的架构保持不变。现在,当我作为消费者去尝试反序列化此消息时,我应该知道,有效负载可以包含基于其生成的业务事件的不同结构。在此场景中,我无法充分利用架构注册表,因为消费者应提前了解所有业务实体。
问题:
现在,当我使用该消息时,作为消费者,我的消费者将从主题消息中读取模式ID,并从模式注册表中获取它,并直接对其进行解码。解码后,如果我对业务事件不感兴趣,则可以忽略该消息。这样,我可以使用架构注册表在同一主题下使用不同的架构。
答案 0 :(得分:1)
请查看https://issues.jboss.org/browse/DBZ-1297,这可能是您的问题的解答,因为它旨在将不透明的字符串展开为Kafka Connect。在这种情况下,您将公开架构。
如果您可以按主题名称策略尝试用于方案,那将是很好的选择。