我正在为 PostgreSQL azure 数据库实现 CDC。我希望将事件发送到 azure 事件中心。我当前的计划是使用 Debezium Server 和事件中心接收器来执行此操作。但是我想按表强制执行事件顺序。从这篇文章我知道我可以通过具有多个分区的单个主题但每次仅将事件从单个表发送到特定分区来做到这一点。
然而,Debezium 似乎没有提供一个很好的方法来处理这个问题。您可以为要发送到的所有事件指定分区键,但不能为每个事件动态指定。我看到的唯一可以解决此问题的另一件事是自定义接收器实现或传递到配置中的自定义 EventHubProducerClient 实现。
我有哪些处理此问题的选项?是否有另一种方法来构建此解决方案,以便我不必使用分区键?或者自定义接收器实现将是我最好的选择?或者我应该放弃 debezium 并编写一个自定义侦听器/发布器?
背景/要求
配置示例:
debezium.source.table.include.list=dbo.TableOne,dbo.TableTwo,dbo.TableThree
debezium.source.transforms=PartitionRouting
debezium.source.transforms.PartitionRouting.type=io.debezium.transforms.partitions.PartitionRouting
debezium.source.transforms.PartitionRouting.partition.payload.fields=source.table,source.table,source.table
debezium.source.transforms.PartitionRouting.partition.topic.num=32
partition.payload.fields
设置(参见文档)确定跨分区分发事件的哈希函数应使用事件中的哪个字段。 source.table
将是不带架构的表名称,因此在此示例中为 TableOne
/TableTwo
/TableThree
。
根据上述配置,来自
TableOne
/TableTwo
/TableThree
的所有事件都将被发送到一个分区。因此,仅使用配置的 32 个分区中的 3 个。
如果设置为
fields=source.table,source.table,change.Id
那么来自 TableOne
和 TableTwo
的所有事件将被发送到它们自己的分区,而来自 TableThree
的事件将在所有 32 个分区之间平均分配(但特定行的所有事件将始终被发送)到同一个分区)。