您正在查看过时的Debezium版本的文档。开云体育官方注册网址
如果您想查看本页最新的稳定版本,请前往在这里

主题的路由

开云体育官方注册网址Debezium允许您在消息到达转换器之前使用单个消息转换重新路由发出的更改SMT.Debezium提供的SMT使您能够根据开云体育官方注册网址正则表达式和替换模式(每个Debezium实例都可配置)重写主题和键。

实现并不关心更改的完整性,这是用户的责任。

用例

逻辑表

逻辑表由一个或多个具有相同表结构的物理表组成。一个常见的用例是分片,例如两个物理表db_shard1.my_table而且db_shard2.my_table一起形成一个逻辑表。

通常,物理表共享相同的模式。

通常,Debeziu开云体育官方注册网址m连接器将每个更改事件发送到由数据库和表命名的主题。开云体育电动老虎机但是由于分片表具有相同的模式,因此我们希望将每个更改事件重新路由到一个由逻辑表名。这样,任何碎片的所有更改事件都指向相同的主题。

如果每个物理表都有一个只在该表中唯一的主键,会发生什么?在这种情况下,shard 1中的一行可以与shard 2中的一行具有相同的主键。由于Debe开云体育官方注册网址zium事件是由组成主键的列来设置键的,因此碎片1中该行的事件将具有与碎片2中该行相同的键,即使它们在全局上是不同的行。因此,除了更改主题名称外,我们可能还想更改修改事件键添加使键全局唯一的字段。

这个SMT允许您指定如何选择新的主题名称,然后指定如何修改更改事件键以确保它是全局唯一的。

主题名称

下面是一个配置的例子,它用另一个字符串替换了主题中表的一部分,允许两个表对同一个主题发出更改:

transforms=Reroute transforms.Reroute.type=io.开云体育官方注册网址 debezum .transforms. bylogicaltablerouter transforms.Reroute.topic.regex=(.*)customers_shard(.*) transforms.Reroute.topic.replacement=$1customers_all_shards

上面的配置将匹配主题,例如myserver.mydb.customers_shard1myserver.mydb.customers_shard2等等,然后用myserver.mydb.customers_all_shards。

关键字段

为了解决上面讨论的所有原始表之间的唯一性问题,在更改事件的关键结构中插入了一个用于标识原始(物理)表的字段。默认情况下,该字段被命名__dbz__physicalTableIdentifier并将原始主题名称作为其值。

如果需要,另一个字段名可以通过什么方式选择key.field.name属性(显然,您希望选择一个与现有主键字段不冲突的字段名)。例如,下面的配置将使用名称shard_id对于关键字段:

...transforms.Reroute.key.field.name = shard_id……

价值的场可通过key.field.regex而且key.field.replacement属性。前者允许您定义正则表达式,该正则表达式将应用于原始主题名称,以捕获一组或多组字符。后者允许您指定一个表达式,该表达式根据捕获的组定义字段的值。例如:

...transforms.Reroute.key.field.regex = (. *) customers_shard (. *) transforms.Reroute.key.field.replacement = 2美元

这将对原始主题名称应用给定的正则表达式,并使用第二个捕获组作为键字段的值。假设源主题已命名myserver.mydb.customers_shard1myserver.mydb.customers_shard2等等,关键字段的值将是12等。