主题命名
Overview
本页上的示例展示了如何配置 MongoDB Kafka connector,以自定义其将记录发布到的主题的名称。
默认情况下,MongoDB Kafka connector将变更事件数据发布到 Kafka 主题,该主题与发起变更事件的 MongoDB命名空间同名。命名空间是一个字符串,由数据库和collection名称与点 ( .
) 字符连接起来组成。
以下部分介绍了自定义连接器将变更事件数据发布到的 Kafka 主题的不同方法:
主题前缀
您可以配置源connector,在事件数据的命名空间前添加一个字符串,并将记录发布到该 Kafka 主题。此设置会自动使用“.”将前缀与命名空间连接起来。 字符。
要指定主题前缀,请使用topic.prefix
配置设置,如以下示例所示:
topic.prefix=myPrefix database=test collection=data
设置完成后,connector将对数据库test
中的collectiondata
的任何更改发布到名为myPrefix.test.data
的 Kafka 主题。
主题后缀
您可以配置您的源connector,将字符串附加到变更事件的命名空间,并将记录发布到那个Kafka主题。此设置会自动将命名空间与后缀用“.”连接起来。 字符。
要指定主题后缀,请使用topic.suffix
配置设置,如以下示例所示:
topic.suffix=mySuffix database=test collection=data
设置完成后,connector将对数据库test
中的collectiondata
的任何更改发布到名为test.data.mySuffix
的 Kafka 主题。
主题命名空间映射
您可以配置源connector,将命名空间值映射到传入变更事件数据的 Kafka 主题名称。主题命名空间映射包含由命名空间模式和目标主题名称模板组成的对。
以下各节介绍connector如何解释命名空间并将其映射到 Kafka 主题。In addition to directly mapping databases and collections to Kafka topics, the connector supports the use of regex and wildcard pairs in topic namespace maps.
您的命名空间映射中的键值对顺序可能会影响connector将事件写入您的主题的方式。连接器按以下顺序匹配命名空间:
与命名空间模式中的数据库和集合名称配对。 要了解有关此命名空间模式的更多信息,请参阅数据库和集合名称示例。
仅与命名空间模式中的数据库名称配对。 要学习;了解有关此命名空间模式的更多信息,请参阅数据库和集合名称示例。
按顺序正则表达式对。 要学习;了解有关此命名空间模式的更多信息,请参阅正则表达式示例。
通配符对。 要学习;了解有关此命名空间模式的更多信息,请参阅通配符示例。
数据库和collection名称
您可以在主题命名空间映射中指定特定数据库和集合的名称,以便将变更事件从这些源写入 Kafka 主题。
如果变更事件的数据库名称或命名空间与映射中的某一字段匹配,则 Connector 会根据与该映射对应的主题名称模板计算目标主题名称,并将事件发布到该主题。
如果变更事件的数据库名称或命名空间与任何映射都不匹配,则连接器将使用默认主题命名方案发布记录,除非不同主题命名设置另有指定。
重要
由于/
字符表示命名空间是正则表达式模式,因此如果命名空间在非正则表达式上下文中包含此字符,connector会引发ConnectConfigException
。
任何同时包含数据库和collection的映射都优先于仅指定源数据库名称的映射。
重要
命名空间映射匹配发生在connector应用任何其他主题命名设置之前。如果已定义,connector则会在映射后将topic.prefix
和topic.suffix
设置应用于主题名称。
以下示例展示如何指定topic.namespace.map
设置来定义从carDb
数据库到automobiles
主题名称模板的主题命名空间映射,以及从carDb.ev
命名空间到electricVehicles
主题名称模板的主题命名空间映射:
topic.namespace.map={"carDb": "automobiles", "carDb.ev": "electricVehicles"}
由于carDb.ev
命名空间映射优先于carDb
映射,因此connector会执行以下操作:
如果变更事件来自数据库
carDb
和集合ev
,则连接器会将目标设置为electricVehicles
主题。如果更改事件来自数据库
carDb
和ev
以外的集合,则连接器会将目标设置为automobiles.<collection name>
主题。如果变更文档来自
carDb
以外的任何数据库,连接器会将目标主题设置为默认命名空间命名方案。如果您定义了
topic.prefix
和topic.suffix
设置,connector将在执行命名空间映射后将其值应用于目标主题名称。
正则表达式
您可以在主题命名空间映射中使用正则表达式 (regex)。 要使用正则表达式,请以正斜杠 ( /
) 字符开始命名空间模式。 按照java.util.regex.Pattern
类指定的语法和行为创建正则表达式。
connector通过对主题名称模板进行变量扩展来计算主题名称。connector支持以下变量:
db
:匹配命名空间中的数据库名称。sep
:topic.separator
配置属性的值。 要学习;了解有关此属性的更多信息,请参阅 Kafka主题属性。coll
:匹配命名空间中的集合名称,如果没有集合名称,则为空字符串。sep_coll
:coll
变量的值,以sep
变量的值为前缀;如果coll
的值为空,则为空字符串。coll_sep
:coll
变量的值,以sep
变量的值作为后缀;如果coll
的值为空,则为空字符串。sep_coll_sep
:以sep
变量值为前缀和后缀的coll
变量值;如果coll
值为空,则为空字符串。
如果您在主题名称模板中使用任何以前的变量,则必须将其括在大括号 ( {}
) 中,以便connector将其展开。您不能在主题名称模板中将大括号用于任何其他目的。
注意
转义字符
创建命名空间模式时,请确保正确处理需要转义的字符。 例如,要匹配.
,正则表达式语法要求您将其转义为\.
但是,根据 JSON 语法,您必须将反斜杠\
字符转义为\\
。 然后,为了匹配命名空间模式中的.
,您必须将其写为\\.
。
此示例展示如何指定topic.namespace.map
设置,以便connector执行以下映射:
将数据库中与正则表达式匹配的事件写入根据
industrial{sep_coll}
主题名称模板计算得出的主题。 正则表达式模式匹配具有vertical
数据库名称的任何命名空间。将事件从
vertical.health
命名空间写入healthcare
主题名称。 在这种情况下,主题名称模板和计算出的主题名称相同。
topic.namespace.map={"/vertical(?:\\..*)?": "industrial{sep_coll}", "vertical.health": "healthcare"}
注意
在此示例中, topic.separator
配置属性为默认值"."
。
由于vertical.health
命名空间映射优先于正则表达式命名空间映射,因此连接器会执行以下操作:
如果变更事件来自
vertical
数据库的health
集合,连接器会将目标设置为healthcare
主题。如果事件来自任何其他具有
vertical
数据库名称的命名空间,connector将根据industrial{sep_coll}
主题名称模板计算目标主题。以下示例演示了此映射:如果更改事件来自
vertical.wasteManagement
命名空间,connector将写入industrial.wasteManagement
主题。如果更改事件来自
vertical
数据库但没有特定collection,则connector将写入industrial
主题。
如果变更文档来自与正则表达式模式不匹配的任何数据库,connector会将目标主题设置为默认命名空间命名方案。
如果您定义了
topic.prefix
和topic.suffix
设置,connector将在执行命名空间映射后将其值应用于目标主题名称。
通配符
除了在主题命名空间映射中指定数据库名称和命名空间空间(如数据库和集合名称所示)之外,您还可以使用通配符*
来匹配来自所有没有映射的数据库和命名空间的变更事件。
topic.namespace.map={"carDb": "automobiles", "carDb.ev": "electricVehicles", "*": "otherVehicles"}
在前面的通配符示例中,connector将源自carDb
以外的所有数据库的文档发布到主题otherVehicles
。