Кэш SchemaRegistryClient не работает, проблема заключается в GET-запросах Schemaregistry, - PullRequest
0 голосов
/ 17 апреля 2019

Я использую Kafka для десериализации сообщений Avro.Для этого программа должна извлечь соответствующую схему из реестра схем.Потоковое приложение реализовано в виде процессора 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);

Таким образом, когда требуется схема, ее вызывает вызов со следующим

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

.Но каждый раз мы делаем новый запрос GET.

В противном случае процессор работает как положено.Просто все эти дополнительные звонки в Schemaregistry являются огромным бременем со временем.Буду признателен за любые предложения

РЕДАКТИРОВАТЬ:

Кэш работает как задумано.Это была просто проблема инициализации, из-за которой он перезагружал URL схемы в каждом onTrigger ().

1 Ответ

0 голосов
/ 22 апреля 2019

Код для извлечения схемы не выглядит правильным.

Интерфейс SchemaRegistryClient имеет только два метода:

RecordSchema getSchema(String schemaName) throws IOException, SchemaNotFoundException;

RecordSchema getSchema(int schemaId) throws IOException, SchemaNotFoundException;

Я не уверен, откуда берется метод getByID, но я думаю, что вы каким-то образом обходите кэширование, проходя другой путь кода.

...