TiCDC的changefeed配置文件中Topic为什么尽量不要用'.'

【 TiDB 使用环境】生产\测试环境\ POC
【 TiDB 版本】6.x
【遇到的问题】
【复现路径】做过哪些操作出现的问题
【问题现象及影响】
1.当我配置TiCDC中的cdc changefeed 配置文件changefeed_config.to时,将topic设置’.'为分隔符

[sink]
dispatchers = [
{matcher = [‘.’], topic = “tidb.{schema}.{table}”},
]

2.在tiflow/cdc/sink/mq/codec/avro.go源码中会将注册schema-registry的subject中所有’.'替换为 ‘_’ ,导致我反序列化时候,根据我的topic="tidb.{schema}.{table}"找不到对应的subject导致报错,TiCDC原码:

const (
replacementChar = “_”
)

func sanitizeTopic(name string) string {
return strings.ReplaceAll(name, “.”, replacementChar)
}

3.kafka-connect源码WorkerSinkTask.java中默认根据topic名称去schema-registry中进行解析,这样导致跟原生kafka-connect不兼容,需要重新定制开发

private SinkRecord convertAndTransformRecord(final ConsumerRecord<byte, byte> msg) {
SchemaAndValue keyAndSchema = retryWithToleranceOperator.execute(() →
keyConverter.toConnectData(msg.topic(), msg.headers(), msg.key()),
Stage.KEY_CONVERTER, keyConverter.getClass());
…ignor other
}

Question:为什么要将’.‘替换成’_’ ?

可能是为了更好兼容kafka的命名规则吧。
kafak的命名规则:

  • 由大小写字母、数字、 .-_ 组成
  • 不能为空、不能为 . 、不能为 ..
  • 长度不能超过249

虽然topic可以含有点(.),但是实际在创建的时候,kafka会把点(.)替换成下划线(_)存储到zk中。但是如果碰到这种情况就会有问题:topic.A_B 和topic_A.B,最终会报topic冲突,因为两者最终的存储是topic_A_B

该主题在最后一个回复创建后60天后自动关闭。不再允许新的回复。