如何在不调用注册新模式的情况下在CachedSchemaRegistryClient中填充缓存?

时间:2016-11-15 23:13:18

标签: java apache-kafka spark-streaming avro confluent

我们有一个与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的本地缓存中以便于快速访问 - 我个人不会这样做。我认为这是今天支持的,那么有没有定制的干净解决方案吗?

我们考虑过自己维护一个本地缓存,但如果汇合可以提供,我们会将其作为最后的手段。

感谢任何建议/想法,提前谢谢。

0 个答案:

没有答案