Java 如何在不调用注册新架构的情况下填充CachedSchemaRegistryClient中的缓存?
我们有一个与Kafka集成的spark流媒体应用程序,我正在尝试对其进行优化,因为它会过度调用Schema Registry来下载Schema 数据的avro模式很少改变,目前我们的应用程序在记录进入时调用模式注册表,这太过分了 我从confluent遇到了一个很有希望的人。虽然在研究了它的实现之后,我不确定如何使用它的内置缓存来减少对Schema注册表的REST调用 上面的链接将带您进入源代码,这里我粘贴的是唯一一个与将模式附加到CachedSchemaRegistrCyclient缓存有关的方法Java 如何在不调用注册新架构的情况下填充CachedSchemaRegistryClient中的缓存?,java,apache-kafka,spark-streaming,avro,confluent-platform,Java,Apache Kafka,Spark Streaming,Avro,Confluent Platform,我们有一个与Kafka集成的spark流媒体应用程序,我正在尝试对其进行优化,因为它会过度调用Schema Registry来下载Schema 数据的avro模式很少改变,目前我们的应用程序在记录进入时调用模式注册表,这太过分了 我从confluent遇到了一个很有希望的人。虽然在研究了它的实现之后,我不确定如何使用它的内置缓存来减少对Schema注册表的REST调用 上面的链接将带您进入源代码,这里我粘贴的是唯一一个与将模式附加到CachedSchemaRegistrCyclient缓存有关的
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中注册(在我们的情况下由另一个应用程序注册),我们只想将该模式放在CachedSchemareRegistrClient的本地缓存中,以便轻松快速地访问-我个人认为,到目前为止,这还不受支持,因此是否有一个没有定制的干净解决方案
我们考虑自己维护一个本地缓存,但如果confluent有什么可以提供的话,我们希望保留它作为最后的手段
任何建议/想法都将不胜感激,提前谢谢。这方面有任何更新吗?@howard,你能得到更多的想法吗?如果有更新,将不胜感激:)。仍在寻找解决方案。这里有什么新消息吗?