我们有一个与Kafka集成的火花流应用程序,我试图对其进行优化,因为它会过度调用Schema Registry来下载架构。
我们的数据的avro架构很少改变,目前我们的应用程序在记录进入时调用Schema Registry,这太过分了。
我从汇合处遇到CachedSchemaRegistryClient,看起来很有希望。虽然在查看其实现后,我不确定如何使用其内置缓存来减少对Schema Registry的REST调用。
上面的链接将带您进入源代码,这里我粘贴了唯一的方法,该方法与将模式附加到CachedSchemaRegistryClient的缓存有关。
public synchronized int register(String subject, Schema schema) throws IOException, RestClientException
{
Object schemaIdMap;
if(this.schemaCache.containsKey(subject)) {
schemaIdMap = (Map)this.schemaCache.get(subject);
} else {
schemaIdMap = new HashMap();
this.schemaCache.put(subject, (Map)schemaIdMap);
}
/*
* let's call the above as the FIRST part of this method, below as the SECOND part
*/
if(((Map)schemaIdMap).containsKey(schema)) {
return ((Integer)((Map)schemaIdMap).get(schema)).intValue();
} else if(((Map)schemaIdMap).size() >= this.identityMapCapacity) {
throw new IllegalStateException("Too many schema objects created for " + subject + "!");
} else {
int id = this.registerAndGetId(subject, schema);
((Map)schemaIdMap).put(schema, Integer.valueOf(id));
return id;
}
}
此方法的目的是将架构注册到架构注册表以及本地缓存并返回其schemaID;如果架构已在本地存在,则返回schemaID。如果我们正在注册一个完整的新模式,这将非常有效。
但是在Schema Registry中已经注册了模式的情况下(在我们的情况下由另一个应用程序注册),我们只想将模式放在CachedSchemaRegistryClient的本地缓存中以便于快速访问 - 我个人不会这样做。我认为这是今天支持的,那么有没有定制的干净解决方案吗?
我们考虑过自己维护一个本地缓存,但如果汇合可以提供,我们会将其作为最后的手段。
感谢任何建议/想法,提前谢谢。