Debezium Outbox模式开启JSON payload展开后空数组丢失如何解决?
问题
基于Debezium官方文档使用PostgreSQL连接器实现Outbox模式时,开启transforms.outbox.table.expand.json.payload=true后出现空数组丢失异常:数据库表中存储的JSON数据{"some":"test", "agreemets":[]},在Kafka主题消息中仅保留{"some":"test"};将该配置设为false则空数组正常存在。
完整Kafka Connect配置如下:
{ "connector.class": "io.debezium.connector.postgresql.PostgresConnector", "tasks.max": "1", "database.hostname": "db", "database.port": "5432", "database.user": "postgres", "database.password": "postgres", "database.dbname": "mycbh_dev", "database.server.name": "db", "schema.include.list": "common", "table.include.list": "common.outboxmessages", "tombstones.on.delete": "false", "transforms": "outbox", "transforms.outbox.type": "io.debezium.transforms.outbox.EventRouter", "transforms.outbox.route.by.field": "topic", "transforms.outbox.route.topic.replacement": "${routedByValue}", "transforms.outbox.table.field.event.timestamp": "created_at", "transforms.outbox.table.expand.json.payload": "true", "transforms.outbox.tracing.with.context.field.only": "true", "plugin.name": "pgoutput" }
解决方案
要在开启JSON payload展开的同时保留空数组,需在现有配置中添加以下参数:
"transforms.outbox.table.expand.json.payload.include.empty.values": "true"
该配置项是Debezium在1.9.7.Final、2.0.1.Final及更高版本中新增的,用于控制展开JSON payload时是否保留空值(包括空数组、空字符串等)。添加后,空数组会被正常保留在Kafka消息中。
若你的Debezium版本低于上述版本,建议先升级到对应版本再添加该配置。
内容的提问来源于stack exchange,提问作者Oleksandr Klosovych
相关产品推荐
相关产品推荐

