2

带发件箱模式的 Debezium

设置上下文:

  1. 使用
  2. 我们想使用模式注册表来存储不同业务实体的所有事件模式
  3. 一个主题可以有多个版本的相同模式
  4. 一个主题可以具有完全不同的模式,并受业务上下文的限制。例如 customerCreated、customerPhoneUpdated、customerAddressUpdated。(使用一种主题名称策略)
  5. 想验证 debezium 是否支持第 2 点和第 3 点(特别是第 3 点)。

想象一下,我有两个业务事件 customerCreated 和 orderCreated,我想将它们存储到同一个主题“com.business.event”中。

客户创建

{ “id”:”244444” “name”:”test”, “address”: “test 123”, “email” : “test@test.com” }

订单创建

{ “id”:”244444” “value”:”1234”, “address”: “test 123”, “phone”: “3333”, “deliverydate”: “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 中的模式保持不变,尽管有效负载包含不同的业务实体。现在,当我作为消费者尝试反序列化此消息时,我应该知道有效负载可以包含基于它们生成的业务事件的不同结构。在这个场景中,我无法充分利用模式注册表,因为消费者应该提前知道所有的业务实体。

问题 :

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

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

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

1 回答 1

1

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

如果您可以为每个主题名称策略的架构尝试它会很好。

于 2019-10-09T10:48:31.663 回答