ksqlDB创建AVRO流时Schema Registry schema名称不匹配如何解决
ksqlDB非默认Schema Registry subject适配解决方案
ksqlDB默认使用 <topic名称>-value 作为AVRO值的Schema Registry查询subject名,你的Topic名称为some_table_prefix.table_name,因此默认会查询不存在的some_table_prefix.table_name-valuesubject,触发报错,可通过以下三种方案解决:
方案1:显式指定subject名称(推荐,ksqlDB 0.18+版本支持)
直接在创建流的WITH参数中添加VALUE_SUBJECT_NAME指定实际的schema subject名即可,示例语句:
CREATE STREAM some_stream_name WITH ( KAFKA_TOPIC='some_table_prefix.table_name', VALUE_FORMAT='AVRO', VALUE_SUBJECT_NAME='table_name-value' );
如果是key的schema不匹配,同理可指定KEY_SUBJECT_NAME参数。
方案2:指定Schema ID(兼容低版本ksqlDB)
如果你的ksqlDB版本低于0.18,不支持VALUE_SUBJECT_NAME参数,可以先查询目标schema的ID,再通过VALUE_SCHEMA_ID参数指定:
- 调用Schema Registry接口查询
table_name-value对应的最新schema ID:GET /subjects/table_name-value/versions/latest,返回结果中的id字段即为schema ID - 替换示例中的
<schema_id>创建流:
CREATE STREAM some_stream_name WITH ( KAFKA_TOPIC='some_table_prefix.table_name', VALUE_FORMAT='AVRO', VALUE_SCHEMA_ID=<schema_id> );
方案3:在Schema Registry中注册兼容subject
如果允许修改Schema Registry资源,可以将已有的table_name-value对应的schema,额外注册到ksqlDB默认查询的some_table_prefix.table_name-valuesubject下,不需要修改ksqlDB创建语句,也不影响原有业务读写该Topic。
内容的提问来源于stack exchange,提问作者Ivan Rubanau
相关产品推荐
相关产品推荐

