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.

Configurar la compatibilidad del Registro de Esquemas en una estrategia tipo upsert.

Tengo un registro de esquemas con compatibilidad FULL_TRANSITIVE para poder leer datos antiguos con el nuevo esquema y viceversa, y esto es completamente adecuado para mis propósitos.

El problema es que necesito tener en algún lugar (posiblemente en el registro de esquemas) la versión completa del esquema para mi tema.

Tomemos un ejemplo (todo está en Avro):

  1. Escribo datos {"foo" :"foo", "bar":"bar"} con el esquema correspondiente que incluye los campos de texto opcionales foo y bar. Así que tenemos la versión del esquema 1 para ese tema.
  2. Luego, escribo {"foo" :"foo", "bar":"bar", "baz":"baz"}, donde baz es un campo de texto opcional adicional (+ foo y bar). El esquema evoluciona, incluyendo también baz, por lo que tenemos la versión del esquema 2.
  3. Ahora escribo {"foo" :"foo", "bar":"bar", "id":"id"}, donde id es un campo de texto opcional adicional (+ foo y bar), pero ahora sin baz (ese es el problema aquí). El esquema evoluciona, incluyendo también id, y tenemos la versión del esquema 3.

El problema aquí es que en el último paso, en la versión del esquema 3, solo tengo los campos foo, bar e id, y aunque puedo leer y escribir perfectamente gracias a la compatibilidad FULL_TRANSITIVE, no tengo en ningún lugar el esquema completo con los campos foo, bar, baz e id, que son campos opcionales de texto.

¿Existe alguna forma de obtener este comportamiento en el registro de esquemas, manteniendo la compatibilidad FULL_TRANSITIVE pero teniendo el esquema completo (con todos los posibles valores) como la última versión del esquema, con el requisito de que no puedo incluir el esquema completo con campos faltantes, sino solo con los campos incluidos en el payload?

Estaba pensando en solicitar el último esquema antes de escribir el registro, para poder construir el registro completo, pero probablemente no sea bueno para el rendimiento.

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una solución potencial a este problema es utilizar la funcionalidad de ‘referencias de esquema’ en Avro. En lugar de tener un solo esquema que incluya todos los campos posibles, cada esquema puede hacer referencia a la versión anterior del esquema y solo incluir los nuevos campos que se hayan añadido.

    Por ejemplo, en el escenario descrito anteriormente, tendríamos tres esquemas separados:

    Versión 1 del esquema:

    {
      "type": "record",
      "name": "Ejemplo",
      "fields": [
        {"name": "foo", "type": ["null", "string"]},
        {"name": "bar", "type": ["null", "string"]}
      ]
    }
    

    Versión 2 del esquema:

    {
      "type": "record",
      "name": "Ejemplo",
      "fields": [
        {"name": "foo", "type": ["null", "string"]},
        {"name": "bar", "type": ["null", "string"]},
        {"name": "baz", "type": ["null", "string"]} // nuevo campo
      ],
      "references": [
        {"name": "Ejemplo_v1", "type": "Ejemplo", "id": 1}
      ]
    }
    

    Versión 3 del esquema:

    {
      "type": "record",
      "name": "Ejemplo",
      "fields": [
        {"name": "foo", "type": ["null", "string"]},
        {"name": "bar", "type": ["null", "string"]},
        {"name": "id", "type": ["null", "string"]} // nuevo campo
      ],
      "references": [
        {"name": "Ejemplo_v1", "type": "Ejemplo", "id": 1},
        {"name": "Ejemplo_v2", "type": "Ejemplo", "id": 2}
      ]
    }
    

    Utilizando este enfoque, cada nueva versión del esquema se basa en la versión anterior al incluir nuevos campos y hacer referencia al esquema de la versión anterior. Esto permite una compatibilidad completa e introspección, al mismo tiempo que mantiene la capacidad de recuperar un esquema “completo” con todos los campos posibles.

    Para recuperar el esquema “completo”, simplemente puedes recuperar la última versión del esquema y recorrer recursivamente las referencias para obtener todas las versiones anteriores del esquema. Alternativamente, puedes especificar la versión deseada del esquema a recuperar utilizando la API del Registro de Esquemas.

    En general, este enfoque proporciona una solución flexible y escalable para la evolución del esquema, al tiempo que cumple con los requisitos descritos en la pregunta.

Comments are closed.