当尝试从KafkaStreams
获取本地状态存储时,如果本地InvalidStateStoreException
实例尚未准备好或状态存储刚刚迁移到另一个实例,则可能会获得KafkaStreams
异常(重新平衡)。
假设我们有DSL拓扑,其中包括addStateStore
添加的本地状态存储以及一些处理或转换(KStream:process
或KStream::transform
)。
以下是我的问题:
InvalidStateStoreException
或ProcessorContext
内部的Processor::init
上下文中获取本地状态存储时,即Transformer::init
异常
KeyValueStore<ByteString, User> userStore =
(KeyValueStore<ByteString, User>) context.getStateStore("store_name");
KeyValueStore<ByteString, User> userStore
的引用,并稍后在userStore
中使用它来修改Punctuator::punctuate
。我们是否应该担心与此商店进行的任何放置/获取/删除操作都出现InvalidStateStoreException
异常?答案 0 :(得分:2)
当从Processor :: init或Transformer :: init中的ProcessorContext上下文中获取本地状态存储时,即会抛出InvalidStateStoreException异常,即
不。在存储准备就绪之前不会调用init()
。因此,InvalidStateStoreException
将永远不会发生。
我们存储对KeyValueStore userStore的引用,并在以后使用它在Punctuator :: punctuate内部修改userStore。我们是否应该担心与此商店进行的任何放置/获取/删除操作上都会收到InvalidStateStoreException异常?
不。您可以安全地读取/写入商店。 InvalidStateStoreException
将永远不会发生。 punctuate()
与process()
由同一线程执行,并确保在调用punctuate()
时存储已准备就绪。