Implement a RocksDBConfigSetter by implementing the org.apache.kafka.streams.state.RocksDBConfigSetter interface and overriding the setConfig method to apply custom Options and BlockBasedTableConfig
In setConfig, build a BlockBasedTableConfig with a large block cache (e.g., new LRUCache(256 * 1024 * 1024L)), enable bloom filters (setFilterPolicy(new BloomFilter(10))), and set it on the Options via tableFormatConfig
Register the custom setter in StreamsConfig: props.put(StreamsConfig.ROCKSDB_CONFIG_SETTER_CLASS_CONFIG, MyRocksDBConfigSetter.class)
Set write_buffer_size, max_write_buffer_number, and level0_file_num_compaction_trigger in Options to tune write amplification versus read performance for your workload
Implement the close method in RocksDBConfigSetter to release native memory (e.g., cache.close()) to prevent off-heap memory leaks when stores are closed
Known gotchas
RocksDB allocates its block cache in native (off-heap) memory; if the JVM Xmx is set close to the container memory limit without accounting for RocksDB's native allocation, the container will be OOM-killed by the OS rather than the JVM
Sharing a single LRUCache instance across multiple state stores (by storing it as a static field and reusing it) reduces total memory usage but requires thread-safe initialization; constructing it inside setConfig creates one cache per store
Bloom filters reduce read I/O for point lookups but have no benefit for range scans (store.range()); enabling large bloom filter bits for stores used primarily for range iteration wastes memory without improving performance
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp