我正在使用版本0.11.0.2的Kafka Streams。
为了提升transform
API,我使用StateStoreSupplier
构建器方法创建了自己的Stores.create
。问题是对我来说某些字段/方法的javadoc不够清楚。
val storeSupplier = Stores.create(STORE_NAME)
.withStringKeys()
.withStringValues()
.persistent()
.disableLogging()
.windowed(WINDOW_SIZE, RETENTION, 3, false)
.enableCaching()
.build()
如何提及更改日志?
/**
* Indicates that a changelog should not be created for the key-value store
*/
PersistentKeyValueFactory<K, V> disableLogging();
这4个值如何相互影响?每个窗口都有最大数量的元素 - windowSize
?一旦到达新窗口就开始了?对于RocksDB,每个窗口可以在磁盘上划分为numSegments
个文件?重复意味着键和值都相同,只能在同一个窗口中检测到它?
/**
* Set the persistent store as a windowed key-value store
* @param windowSize size of the windows
* @param retentionPeriod the maximum period of time in milli-second to keep each window in this store
* @param numSegments the maximum number of segments for rolling the windowed store
* @param retainDuplicates whether or not to retain duplicate data within the window
*/
PersistentKeyValueFactory<K, V> windowed(final long windowSize, long retentionPeriod, int numSegments, boolean retainDuplicates);
这里暗示了什么样的缓存?
/**
* Caching should be enabled on the created store.
*/
PersistentKeyValueFactory<K, V> enableCaching();
答案 0 :(得分:2)
我可以自信地回答这些问题中的2/3:
如何提及更改日志?
更改日志是一个名为$applicationId-$storename-changelog
的主题。它是一个简单的键值主题,其中键是表键,值是表值。本主题由Kafka Streams创建和管理。如果你做disableLogging
,据我所知,如果在没有重放你的整个拓扑结构的情况下(如果它是可重放的话)丢失,商店将无法恢复;
这里暗示了什么样的缓存?
访问底层RocksDB实例之前的LRU内存缓存。具体请参见CachedStateStore
和CachedKeyValueStore
,例如CachedKeyValueStore#getInternal()
。
关于:
这4个值如何相互影响?每个窗口都有最大数量的元素 - windowSize?一旦到达新窗口就开始了?对于RocksDB,每个窗口可以划分为磁盘上的numSegments文件?重复意味着键和值都相同,只能在同一个窗口中检测到它?
我最近没有仔细看过这些内部结构以便完全记住。我可以说以下内容:
KTable
,则KTable
仅在topology commits and the store flushes时将邮件转发给其子女。RocksDBSegmentedBytesStore
及其相关性Segments
。