Estamos utilizando kafka con esquemas avro y el registro de esquema configurado para compatibilidad FULL . Nuestros esquemas usan campos logicalType , por ejemplo:
{ "name": "MyRecord", "type": "record", "fields": [ { "name": "created_at", "type": [ "null", { "type": "long", "logicalType": "timestamp-millis" } ], "default": null } ] } Esto funciona bien con la versión bastante antigua de confluent-kafka que estamos usando, ya que depende de avro-python3 1.8. Sin embargo, confluent-kafka reciente depende de avro-python3 1.10, y la serialización de mensajes falla con TypeError: unhashable type: 'mappingproxy'
Abrí un PR para solucionar el problema , pero no está recibiendo mucha atención.
Suponiendo que no se fusionará, ¿qué otras opciones tengo para actualizar a un confluent-kafka reciente?
La única solución que veo es deshacerme de logicalType , pero eso será un cambio de esquema incompatible, por lo que renuncio a la compatibilidad FULL o uso un tema diferente vinculado a un esquema diferente.
E incluso si lo anterior funciona, entonces tengo que convertir manualmente milis en marcas de tiempo, lo cual es un gran cambio en nuestra base de código.
Su esquema no es válido Avro. La documentación establece que “cuando se especifica un valor predeterminado para un campo de registro cuyo tipo es una unión, el tipo del valor predeterminado debe coincidir con el primer elemento de la unión” . Para su campo created_at " null " es el único valor predeterminado válido; de lo contrario, tendrá que definir su esquema como
... { "name": "created_at", "type": [ { "type": "long", "logicalType": "timestamp-millis" }, "null" ], "default": 1 } ...esto tendría un valor predeterminado del 1 de enero de 1970 (en realidad, 1 milisegundo después de la medianoche), que podría no ser lo que desea.