Я пытаюсь понять поведение RocksDB в API процессора потоков Kafka. Я настраиваю постоянное хранилище StateStore, используя стандартную базу данных RocksDB, которую предоставляет KStreams.
StoreBuilder countStoreBuilder =
Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore("Counts"),
Serdes.String(),
Serdes.Long())
Я не занимаюсь агрегацией, объединением или управлением окнами. Я просто получаю записи и сравниваю некоторые из них с предыдущими элементами в магазине и сохраняю некоторые записи, которые я получаю, в хранилище состояний.
В руководстве разработчика упоминается, что вы можете включить кеширование записей в Processor API, вызвав .withCachingEnabled()
в указанном выше построителе.
Кеш "служит кешем чтения для ускорения чтения данных из хранилища состояний" - Записывать кеш-потоки Kafka
Однако я понимаю, что RocksDB в постоянном режиме сначала буферизуется в памяти и будет расширяться на диск только в том случае, если состояние не помещается в ОЗУ.
RocksDB используется просто как внутренняя таблица поиска (которая может сбрасываться на диск, если состояние не помещается в память. Сброс RocksDB требуется только потому, что состояние может быть больше, чем доступная основная память. Управление внутренними данными Kafka Streams
Итак, как кеши записей ускоряют чтение из хранилища состояний, если оба буферизируются в памяти? Мне кажется, что кеши записей частично совпадают с поведением RocksDB.