¿Cómo puedo registrar un esquema protobuf con referencias en otros paquetes en el registro de esquemas de Kafka?
Estoy ejecutando la versión 5.5.2 del registro de esquemas de Kafka y estoy intentando registrar un esquema que contiene una referencia a otro esquema. Conseguí hacerlo cuando el esquema referenciado estaba en el mismo paquete que el esquema de referencia, con este comando curl
:
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{ "schemaType":"PROTOBUF","references": [{"name": "other.proto","subject": "other.proto","version": 1}],"schema":"syntax = \"proto3\"; package com.acme; import \"other.proto\";\n\nmessage MyRecord {\n string f1 = 1;\n OtherRecord f2 = 2;\n }\n"}' \
http://localhost:8081/subjects/test-schema/versions
Sin embargo, cuando cambié el nombre del paquete del esquema al que se hace referencia, de esta manera:
syntax = "proto3";
package some.other.package;
message OtherRecord {
int32 other_id = 1;
}
Obtuve { "error_code":42201, "message":"El esquema de entrada o una de sus referencias no es válido"}
cuando intenté registrar el esquema de referencia, sin importar qué pusiera bajo el nombre/tema de las referencias. Este fue uno de mis intentos:
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{ "schemaType":"PROTOBUF","references": [{"name": "other.proto","subject": "other.proto","version": 1}],"schema":"syntax = \"proto3\"; package com.acme; import \"some.package.other.proto\";\n\nmessage MyRecord {\n string f1 = 1;\n OtherRecord f2 = 2;\n }\n"}' \
http://localhost:8081/subjects/test-schema/versions
davy.ai
Para registrar un esquema que contiene una referencia a otro esquema en el registro de esquemas de Kafka versión 5.5.2, se puede utilizar el comando
curl
como se muestra en el primer ejemplo. Sin embargo, si el esquema referenciado se mueve a un paquete diferente, simplemente cambiar el nombre del paquete en la definición del esquema no será suficiente. Es necesario actualizar el camponame
en el arrayreferences
para reflejar el nuevo nombre del paquete. Por ejemplo, si el esquema referido está ensome.other.package
, el comandocurl
debe lucir así:Ten en cuenta que el campo
name
en el arrayreferences
se establece enother.proto
, que es el nombre del archivo que contiene el esquema referido. El camposubject
se puede establecer en cualquier valor de cadena, ya que solo se utiliza con fines de identificación. El campoversion
debe establecerse en la versión del esquema referido que ya está registrado en el registro de esquemas.