Debezium发件箱模式|如果我们使用debezium

时间:2019-10-07 02:28:40

标签: confluent-schema-registry debezium outbox-pattern

带有发件箱模式的Debezium

设置上下文:

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

想象一下,我有两个业务事件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中的架构保持不变。现在,当我作为消费者去尝试反序列化此消息时,我应该知道,有效负载可以包含基于其生成的业务事件的不同结构。在此场景中,我无法充分利用架构注册表,因为消费者应提前了解所有业务实体。

问题:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

如果您可以按主题名称策略尝试用于方案,那将是很好的选择。