我们已经将Confluent Schema Registry与KafkaStreams结合使用了一年多,并且一切运行良好;直到昨天。
在UAT环境中,我们似乎已删除了一个Schema主题,并且我们的一个应用程序开始通过消息进行故障转移
[ERROR] LogAndFailExceptionHandler-在执行期间捕获到异常 反序列化,taskId:0_13,主题:TOPIC_NAME,分区:13 偏移量:0 org.apache.kafka.common.errors.SerializationException:错误 检索ID为1531的Avro模式
我检查了Schema Registry,发现主题丢失了,并使用例如curl的错误查询了列出的ID 1531:
curl -X GET http://SchemaRegistryHost:8081/schemas/ids/1531
然后回来:
{"error_code":40403,"message":"Schema not found"}
我天真地尝试不考虑它就再次注册该架构,它可以工作,但是该架构所注册的ID与以前的1531 ID不同。
我需要注册到ID 1531的架构,因为该主题中的现有消息已经在魔术字节中包含了ID 1531。
我在https://docs.confluent.io/current/schema-registry/docs/develop/api.html处检查了API文档,但没有看到为架构设置给定ID的任何信息。
反正有通过架构注册表将架构强制为特定ID的方法吗?
我知道一些备份解决方案,但是我现在正在寻找一种修复程序,有望防止数据丢失或采取特殊措施修复主题数据。
答案 0 :(得分:0)
反正有通过架构注册表将架构强制为特定ID的方法吗?
没有。
ID 1531实际上并没有“消失”,顺便说一句,它只是在注册表中被标记删除了(请查看_schemas
主题进行查看)。
当您使用KafkaAvroDeserializer时,确实无法解决我所知道的错误。您将必须使用ByteArrayDeserializer,然后使用Schema Registry客户端“修复”或“查找”正确的ID,然后反序列化其余消息。
另一个选择是重置使用者组,以便您完全跳过这些消息或设置异常处理。 Handling bad messages using Kafka's Streams API