首页 > 解决方案 > SchemaRegistryClient 缓存不起作用,不必要的 Schemaregistry GET 请求是问题所在,

问题描述

我正在使用 Kafka 反序列化 Avro 消息。为此,程序应该从 Schema 注册表中提取相应的 Schema。流媒体应用程序被实现为一个 Nifi 处理器,它本身就可以工作。问题是,在每个流程之后,都会请求一个新的模式。似乎没有缓存任何架构。

这部分日志是问题所在:

    2019-04-16 22:08:51,333 INFO [Timer-Driven Process Thread-2]                 i.c.k.s.KafkaAvroDeserializerConfig KafkaAvroDeserializerConfig values:
        schema.registry.url = [http://localhost:8081]
        max.schemas.per.subject = 1000
        specific.avro.reader = false

调用 CachedSchemaRegistryClient 时,会认为模式是自动缓存的吗?

private SchemaRegistryClient schemaRegistryClient;

            this.schemaRegistryClient = new CachedSchemaRegistryClient(schemaUrl, 1000);

因此,当需要 Schema 时,调用以下内容

return schemaRegistryClientProvider.getSchemaRegistryClient().getByID(avroSchemaId);

正在供应它。但是每次我们发出一个新的 GET 请求。

否则处理器按预期工作。随着时间的推移,所有这些对 Schemaregistry 的额外调用都是一个巨大的负担。任何建议,将不胜感激

编辑:

缓存按预期工作。这只是一个初始化问题,导致它在每个 onTrigger() 处重新加载模式 URL。

标签: apache-kafkaschemaapache-nifiavroconfluent-schema-registry

解决方案


检索模式的代码似乎不正确。

SchemaRegistryClient 接口只有两个方法:

RecordSchema getSchema(String schemaName) throws IOException, SchemaNotFoundException;

RecordSchema getSchema(int schemaId) throws IOException, SchemaNotFoundException;

我不确定 getByID 方法的来源,但我认为您通过不同的代码路径以某种方式绕过缓存。


推荐阅读