Entender la compatibilidad en Schemas Avro

Compatibilidad entre Schemas Avro

Compatibilidad entre Schemas Avro


En un artículo anterior hablamos sobre la el gobierno de eventos con Schema Registry, en el que tratamos que existen diferentes compatibilidades a la hora de evolucionar nuestro Schema. Este tema a veces, cuesta comprenderlo, así en este artículo sobre «entender la compatibilidad en Schemas Avro» vamos a ver los diferentes tipos y las compatibilidades entre ellos a través de ejemplos.

Cuando trabajamos con compatibilidades entre Schemas, en muchas ocasiones nos aparecerán mensajes sobre incompatibilidades entre Schemas sin que alguna vez nos quede del todo claro el motivo. En este artículo vamos a ver a través de diferentes schemas las posibles combinaciones y versiones válidas.

Si quieres ver la documentación oficial de confluence puedes echar un ojo aquí.

Vamos a comenzar viendo las diferentes tipos de compatibilidades.

Compatibilidades y ejemplos entre Schemas Avro

Existen diferentes compatibilidades cuando evolucionamos nuestros schemas, vamos a ver los posibles errores que nos darían entre compatibilidades partiendo de los siguientes ejemplos:

Compatibilidad Backward

Con la compatibilidad Backward el consumidor que esta usando el nuevo esquema puede leer la información producida con el último esquema. Hay que tener en cuenta que para no «romper» al consumidor deberíamos actualizar primero el consumidor.

Vamos a partir de los siguientes esquemas:

Compatibilidad entre Schemas Avro Backward
Compatibilidad entre Schemas Avro Backward

Si nos basamos en los ejemplos anteriores tendríamos la siguiente compatibilidad:

Versión 2Versión 3Versión 4Versión 5Versión 6
Versión 1FalseTrueFalseTrueTrue
  • versión 1 no es compatible con versión 2: La versión 1 y la 2 no son compatibles debido a que la versión 2 tiene una columna adicional, sin valor adicional.
  • versión 1 compatible con versión 3: Ambas versiones son compatibles porque la versión 3 tiene un valor por defecto, así que los consumidores que leen el schema 1 pueden hacerlo con la versión 3.
  • Versión 1 con la versión 4: No son compatibles porque el campo id se le ha cambiado el tipo de dato.
  • Versión 1 con la versión 5: Sí son compatibles.
  • Versión 1 con la versión 6: Aunque se ha cambiado el nombre de la columna se ha añadido un alias haciendo referencia al nombre anterior. Por lo que sí son compatibles.

Compatibilidad Backward Transitive

Cuando hacemos uso de la compatibilidad Backward Transitive lo que estamos indicando es que el consumidor puede leer información de anteriores versiones de los esquemas.

Compatibilidad entre Schemas Avro Backward Transitive
Compatibilidad entre Schemas Avro Backward Transitive

Vamos a partir de los esquemas base versión 1 y versión 2 como ya registrados:

Versión 2Versión 3Versión 4Versión 5Versión 6
Versión 1TrueFalseFalseTrueTrue
  • versión 2: La versión 2 es compatible hacia atrás con la versión 1 porque el nuevo campo tiene valor por defecto
  • versión 3: Esta versión el problema que tiene es el nuevo campo birth el cual no es compatible con la primera versión del esquema. Por lo que al intentar guardar el esquema dará un error y no podrá quedar registrado.
  • versión 4: Sino fuera porque esta versión cambia el tipo de datos del id, podría ser compatible con ambas versiones.
  • versión 5: Es compatible con las versiones 1 y 2, lo consumidores podrían leer ambos esquemas sin problema.
  • versión 6: Al igual que la versión 5, aunque el nombre cambia tiene un alias, con lo que los consumidores podrían leer los esquemas sin problema.

Compatibilidad Forward en Schemas Avro

En la compatibilidad Forward el consumidor va a poder leer información con el último esquema producido con el nuevo esquema. Pero al utilizar el nuevo esquema no se puede asegurar que sea compatible con versiones anteriores a la última.

Al usar la compatibilidad Forward, el productor se tiene que actualizar primero.

Vamos a ver las compatibilidades partiendo de los siguientes ejemplos:

Compatibilidad entre Schemas Avro Forward
Compatibilidad entre Schemas Avro Forward
Versión 2Versión 3Versión 4Versión 5Versión 6
Versión 1TrueTrueFalseFalseFalse
  • versión 1 es compatible con versión 2: Aunque tengamos una columna nueva, el consumidor con la versión 1 puede leer la versión 3. Únicamente la columna será ignorada.
  • versión 1 es compatible con versión 3: Aunque hay una columna más, el consumidor con la versión 1 puede leer la versión 3, simplemente la nueva columna se ignora.
  • versión 1 no es compatible con versión 4: El tipo de el id es diferente para la versión 4, por lo que un consumidor con la versión 1 no podría leerlo.
  • versión 1 no es compatible con versión 5: La versión 5 únicamente tiene un campo, por lo que un consumidor con la versión 1 que quiera leer de esa versión le faltarían más campos.
  • versión 1 no es compatible con la versión 6: Estas dos versiones no son compatibles por el mismo motivo que la versión 5.

Compatibilidad Forward Transitive

En la compatibilidad Forward Transitive, un consumidor que usa el último schema puede leer información producida por el nuevo schema y por los anteriores.

Cuando hacemos uso de la compatibilidad Forward Transitive para nuestros schemas de Avro lo primero que deberíamos hacer es actualizar el schema del productor.

Forward Transitive
Compatibilidad entre Schemas Avro Forward Transitive
Versión 2Versión 3Versión 4Versión 5Versión 6
Versión 1TrueTrueFalseFalseFalse
  • versión 2: Aunque tengamos una columna nueva, el consumidor con la versión 1 puede leer la versión 3. Únicamente la columna será ignorada.
  • versión 3: Esta versión del schema va a ser compatible, ya el la versión 2 puede leer la versión 1 y la versión 3 tiene la misma columna con el mismo tipo que la versión. Por lo que no habría ningún problema de compatibilidad.
  • versión 4: La versión 4 tiene un tipo de dato (id) diferente por lo que no es compatible, además le falta la columna birth.
  • versión 5: A la versión 5 le faltan 3 columnas, birth, name y address.
  • versión 6: Mismo problema que la versión 5.

Compatibilidad Full en Schemas Avro

La última compatibilidad que nos queda por analizar es la compatibilidad FULL. Con la compatibilidad Full el consumidor con un nuevo schema puede leer información que ha sido producida por el último schema y un consumidor con el último schema puede, también, leer información producida por el nuevo schema.

Es decir, la compatibilidad Full son los dos tipos de compatibilidad que vimos anteriormente, backward y forward. Esta compatibilidad no tiene que asegurar las compatibilidades con versiones anteriores a la última versión.

Al hacer uso de la compatibilidad Full, la actualización del schema se puede hacer en cualquier orden, es decir, da igual si primero se actualiza el consumidor o el productor.

Vamos a ver las compatibilidades partiendo de lo siguiente, teniendo en cuenta que el schema base es la versión 1.

Compatibilidad entre Schemas Avro Full
Compatibilidad entre Schemas Avro Full
Versión 2Versión 3Versión 4Versión 5Versión 6
Versión 1FalseTrueFalseFalseFalse

  • Schema versión 1 con Schema versión 2: La compatibilidad entre estos dos schemas va a fallar debido a que no tenemos compatibilidad Backward. Aunque sí tiene compatibilidad Forward. El problema es por la columna Birth, consumidores con el schema 2 no pueden leer la información del schema 1.
  • versión 1 con versión 3: Ambos schemas van a ser compatibles. Por un lado son compatibles hacia adelante (Forward) porque la columna birth se puede ignorar, y por otro lado, al tener valor default es compatible con Backward.
  • Schema versión 1 con Schema versión 4: La versión 1 y la 4 claramente no van a ser compatibles debido al cambio del tipo de datos en la columna id.
  • versión 1 con versión 5: La versión 1 y la 5 no tienen compatibilidad Full, aunque sí tienen compatibilidad Backward. La compatibilidad Forward falla debido porque faltan columnas.
  • Schema versión 1 con Schema versión 6: Entre la versión 1 y la 6 ocurre lo mismo que con la versión 5, no van a tener compatibilidad debido a que faltan columnas.

Full Transitive compatibilidad en Schemas Avro

Cuando hacemos uso de Full Transitive en nuestros Schemas Avro la compatibilidad será valida si el consumidor con un nuevo schema puede leer información que ha sido producida por los schemas anteriores y un consumidor con schemas anteriores puede leer información producida por el nuevo schema.

Al hacer uso de esta compatibilidad, podemos actualizar el schema en cualquier orden.

Full Transitive
Compatibilidad entre Schemas Avro Full Transitive
Versión 2Versión 3Versión 4Versión 5Versión 6
Versión 1TrueFalseFalseFalseFalse
  • Schema versión 2: Tendría compatibilidad total, ya que tendríamos Forward Transitive, ya que los consumidores con la versión 1 pueden leer la versión 2, ya que la nueva columna será ignorada. Y además, tenemos Backward Transitive porque la nueva columna tiene un valor por defecto.
  • versión 3: En la versión 3 del schema no hay compatibilidad, ya que no hay Backward Transitive. Los consumidores con la versión 3 no podrían leer la versión 1.
  • Schema versión 4: La versión 4 del schema tiene el campo id como string en lugar de int, por lo que no es compatible con la versión 1.
  • versión 5: Con la versión 5 no tenemos compatibilidad, ya que Forward Transitive no sería válida debido a que la versión 5 solo tiene una columna y un consumidor del schema 1 no podría leer datos de la versión5.
  • Schema versión 6: Mismo caso que en la versión 5.

Conclusión

Entender la compatibilidad en Schemas Avro nos va a ayudar a tener un mayor control sobre las versiones de nuestros schemas así como un histórico de los cambios que se producen de una manera ordenada.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *