我已经部署了Kafka-Cluster,并且已经在运行生产,并且主题为“ existing-topic ”。我正在使用Debezium的MongoDB-Source-Connector。
这里我要做的就是将CDC事件直接推送到主题“ existing-topic ”,这样我已经在听该主题的消费者就可以对其进行处理。
我没有找到这样做的任何资源,但是提到该主题是以以下格式创建的-
“如果您的mongodb.name参数为A,数据库名称为B且集合名称为C,则数据库A和集合C的数据将被加载到主题A.B.C下”
我可以将主题更改为“ existing-topic”并将事件推送到该主题吗?
答案 0 :(得分:0)
Kafka主题的名称始终采用以下形式
logicalName.databaseName.collectionName
,其中logicalName
是mongodb.name
指定的连接器logical name 配置属性,databaseName
是数据库的名称,其中 操作发生,并且collectionName
是MongoDB的名称 受影响的文档所在的集合。
这意味着,如果连接器的逻辑名称为myConnector
,并且数据库myDatabase
具有两个集合users
和orders
{
"name": "myConnector",
"config": {
"connector.class": "io.debezium.connector.mongodb.MongoDbConnector",
"mongodb.hosts": "mongo-db-host:27017",
"mongodb.name": "myDatabase",
"collection.whitelist": "myDatabase[.]*",
}
}
然后Kafka Connect将使用名称填充两个主题:
myConnector.myDatabase.users
myConnector.myDatabase.orders
现在,如果您仍想更改目标主题的名称,则可以使用Kafka Connect单消息转换(SMT)。更准确地说,ExtractTopic
应该可以为您提供帮助。请注意,尽管此SMT可以帮助您从消息的键或值中提取主题名称,但因此您需要以某种方式在有效负载中包括所需的主题名称。
例如,以下SMT将提取字段myField
的值并将其用作记录的主题:
transforms.ValueFieldExample.type=io.confluent.connect.transforms.ExtractTopic$Value
transforms.ValueFieldExample.field=myField
答案 1 :(得分:0)
我在使用JDBC Source Connector时遇到了同样的问题,并找到了不同的解决方案:
使用RegexRouter
单消息转换和dropPrefix
,您可以覆盖整个主题名称:
"transforms":"dropPrefix",
"transforms.dropPrefix.regex":"A.B.C", // whole created topic name
"transforms.dropPrefix.replacement":"existing-topic" // whole exisiting topic name
它与正则表达式一起使用,因此,如果您使用多个表/集合,并且创建的主题名称不是恒定的,则应该可以使其动态化。
从技术上讲,我要删除整个主题名称,然后添加一个新的主题名称,这有点不客气-无论如何,这对我而言并不是最佳解决方案。