es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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
Tags:  , ,

Answer

  1. Avatar for 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 campo name en el array references para reflejar el nuevo nombre del paquete. Por ejemplo, si el esquema referido está en some.other.package, el comando curl debe lucir así:

    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.other.package.other.proto\";\n\nmessage MyRecord {\n  string f1 = 1;\n  OtherRecord f2 = 2;\n }\n"}' \
    http://localhost:8081/subjects/test-schema/versions
    

    Ten en cuenta que el campo name en el array references se establece en other.proto, que es el nombre del archivo que contiene el esquema referido. El campo subject se puede establecer en cualquier valor de cadena, ya que solo se utiliza con fines de identificación. El campo version debe establecerse en la versión del esquema referido que ya está registrado en el registro de esquemas.

Comments are closed.