I’m trying to make ksqlDB work with Apicurio Registry (RedHat) and have had a few issues with compatibility with Debezium.
So, Apicurio has 4 different APIs that can be used. The “official” and recommended api is called "/registry/v2" and it seems to work fine with my Debezium connector. ksqlDB however, when configured to use it, is trying to access “/subjects” which isn’t known by this API. For that to work, I have to point it to the "/ccompat/v6" API which is made to be compatible with Confluent Schema Registry clients. When I make ksqlDB point to this one, it works all good… until the IDs (Global-Id and Content-Id) in Apicurio aren’t synced anymore.
As seen here, Apicurio has 3 different IDs to identifiy a schema:
Debezium uses the “Global-Id” to put in the as “Schema-Id” of each Kafka messages it produces. ksqlDB then reads that ID and tries to find it in Apicurio, but using the “Content-Id” instead. So either it’ll never find it or it will find a random schema. In both cases, it gives me a deserialization error :
ERROR {“type”:0,“deserializationError”:{“target”:“value”,“errorMessage”:“Error deserializing message from topic: debezium-topic-1”,“recordB64”:null,“cause”:["Failed to deserialize data for topic debezium-topic-1 to Avro: ",“Error retrieving Avro value schema for id 96”,“No content with id/hash ‘contentId-96’ was found.; error code: 40403”]
Is there a way to make ksqlDB use the official Apicurio Registry API (/registry/v2/) or alternatively, is there a way to force it to use “Global-Id” instead of “Content-Id” ?
Thanks for the help!
Found my answer... there is a "Legacy ID mode" in Apicurio which you can enable in the settings through the Apicurio web UI :
Once I turned that on, it worked perfectly with ksqlDB and the /ccompat/v6 API.