使用特定ID将架构添加到架构注册表

时间:2019-03-21 14:38:24

标签: java apache-kafka confluent-schema-registry

我们已经将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的方法吗?

我知道一些备份解决方案,但是我现在正在寻找一种修复程序,有望防止数据丢失或采取特殊措施修复主题数据。

1 个答案:

答案 0 :(得分:0)

  

反正有通过架构注册表将架构强制为特定ID的方法吗?

没有。


ID 1531实际上并没有“消失”,顺便说一句,它只是在注册表中被标记删除了(请查看_schemas主题进行查看)。


当您使用KafkaAvroDeserializer时,确实无法解决我所知道的错误。您将必须使用ByteArrayDeserializer,然后使用Schema Registry客户端“修复”或“查找”正确的ID,然后反序列化其余消息。

另一个选择是重置使用者组,以便您完全跳过这些消息或设置异常处理。 Handling bad messages using Kafka's Streams API