尝试使用可为null的密钥模式发布记录时,kafka rest代理中出现异常“正在注册的模式与早期模式不兼容”

okxuctiv  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(385)

我正试着把这条信息发到Kafka·莱斯特:

{
  "key_schema": "[\"null\",\"long\"]",
  "value_schema": "{\"type\":\"record\",\"name\":\"GVEDGE_FI_INVOICE_TX_INFO_V2\",\"namespace\":\"com.vistajet.gvedge.infrastructure.kafka.connector\",\"fields\":[{\"name\":\"XID\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"ID\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"INVOICE_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"INVOICE_DETAIL_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"ADDITIONAL_INVL_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"COST_ALLOCATION_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null}],\"connect.name\":\"com.vistajet.gvedge.infrastructure.kafka.connector.GVEDGE_FI_INVOICE_TX_INFO_V2\"}",
  "records": [
    {
      "key": {
        "long": 140766
      },
      "value": {
        "XID": {
          "long": 29524623
        },
        "ID": {
          "long": 140766
        },
        "INVOICE_CHANGE_COUNT": {
          "long": 1
        },
        "INVOICE_DETAIL_CHANGE_COUNT": {
          "long": 0
        },
        "ADDITIONAL_INVL_CHANGE_COUNT": {
          "long": 0
        },
        "COST_ALLOCATION_CHANGE_COUNT": {
          "long": 0
        }
      }
    }
  ]
}

rest-proxy.log中有以下错误:
[2019-04-11 14:25:58,991]错误未处理的异常导致内部服务器错误响应(io.confluent.rest.exceptions.genericexceptionmapper:38)org.apache.kafka.common.errors.serializationexception:注册avro架构时出错:“long”原因:io.confluent.kafka.schemaregistry.client.rest.exceptions.restclientexception:正在注册的架构是与早期模式不兼容;错误代码:409
为什么会这样???我不明白为什么

"key": {
        "long": 140766
      }

正在触发新的模式创建吗?。。。
顺便说一句

"key": null

工作正常。

xwmevbvl

xwmevbvl1#

您正在将键值设置为对象。

"key": {
        "long": 140766
      }

不反映您的模式:

"key_schema": "[\"null\",\"long\"]",

试试这个:

{
  "key_schema": "{\"type\":\"long\"}",
  "value_schema": "{\"type\":\"record\",\"name\":\"GVEDGE_FI_INVOICE_TX_INFO_V2\",\"namespace\":\"com.vistajet.gvedge.infrastructure.kafka.connector\",\"fields\":[{\"name\":\"XID\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"ID\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"INVOICE_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"INVOICE_DETAIL_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"ADDITIONAL_INVL_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"COST_ALLOCATION_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null}],\"connect.name\":\"com.vistajet.gvedge.infrastructure.kafka.connector.GVEDGE_FI_INVOICE_TX_INFO_V2\"}",
  "records": [
    {
      "key": 234,
      "value": {
        "XID": {
          "long": 29524623
        },
        "ID": {
          "long": 140766
        },
        "INVOICE_CHANGE_COUNT": {
          "long": 1
        },
        "INVOICE_DETAIL_CHANGE_COUNT": {
          "long": 0
        },
        "ADDITIONAL_INVL_CHANGE_COUNT": {
          "long": 0
        },
        "COST_ALLOCATION_CHANGE_COUNT": {
          "long": 0
        }
      }
    }
  ]
}

现在你的钥匙是长型的。所以,您只能传递数据中键旁边的数字。
但是,如果要将键值保留为对象(如上面的示例中所示),则还需要将键值定义为记录类型:

{
  "key_schema": "{\"type\":\"record\",\"name\":\"GVEDGE_FI_INVOICE_TX_INFO_V2_KEY\",\"namespace\":\"com.vistajet.gvedge.infrastructure.kafka.connector\",\"fields\":[{\"name\":\"long\",\"type\":[\"null\",\"long\"]}]}",
  "value_schema": "{\"type\":\"record\",\"name\":\"GVEDGE_FI_INVOICE_TX_INFO_V2\",\"namespace\":\"com.vistajet.gvedge.infrastructure.kafka.connector\",\"fields\":[{\"name\":\"XID\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"ID\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"INVOICE_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"INVOICE_DETAIL_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"ADDITIONAL_INVL_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null},{\"name\":\"COST_ALLOCATION_CHANGE_COUNT\",\"type\":[\"null\",\"long\"],\"default\":null}],\"connect.name\":\"com.vistajet.gvedge.infrastructure.kafka.connector.GVEDGE_FI_INVOICE_TX_INFO_V2\"}",
  "records": [
    {
      "key": {
          "long": {"long": 7}
       },
      "value": {
        "XID": {
          "long": 29524623
        },
        "ID": {
          "long": 140766
        },
        "INVOICE_CHANGE_COUNT": {
          "long": 1
        },
        "INVOICE_DETAIL_CHANGE_COUNT": {
          "long": 0
        },
        "ADDITIONAL_INVL_CHANGE_COUNT": {
          "long": 0
        },
        "COST_ALLOCATION_CHANGE_COUNT": {
          "long": 0
        }
      }
    }
  ]
}


现在回到您的主要问题“正在注册的模式与以前的模式不兼容”。
该消息向self解释了您正在尝试更改模式。但是,您不能更改它,因为它与当前版本的架构不兼容。
如果您确定它只用于开发,那么现在可以将模式兼容性级别更改为“none”。

然后再试一次。
否则,请检查您在以前的密钥模式和新密钥模式之间更改了什么,以及为什么不兼容。

相关问题