从ProcessorContext获取状态存储时,是否可能发生InvalidStateStoreException?

时间:2019-01-18 17:37:29

标签: apache-kafka-streams

当尝试从KafkaStreams获取本地状态存储时,如果本地InvalidStateStoreException实例尚未准备好或状态存储刚刚迁移到另一个实例,则可能会获得KafkaStreams异常(重新平衡)。

假设我们有DSL拓扑,其中包括addStateStore添加的本地状态存储以及一些处理或转换(KStream:processKStream::transform)。

以下是我的问题:

  1. InvalidStateStoreExceptionProcessorContext内部的Processor::init上下文中获取本地状态存储时,即
  2. ,是否可能引发Transformer::init异常
KeyValueStore<ByteString, User> userStore =  
    (KeyValueStore<ByteString, User>) context.getStateStore("store_name"); 
  1. 我们存储对KeyValueStore<ByteString, User> userStore的引用,并稍后在userStore中使用它来修改Punctuator::punctuate。我们是否应该担心与此商店进行的任何放置/获取/删除操作都出现InvalidStateStoreException异常?

1 个答案:

答案 0 :(得分:2)

  

当从Processor :: init或Transformer :: init中的ProcessorContext上下文中获取本地状态存储时,即会抛出InvalidStateStoreException异常,即

不。在存储准备就绪之前不会调用init()。因此,InvalidStateStoreException将永远不会发生。

  

我们存储对KeyValueStore userStore的引用,并在以后使用它在Punctuator :: punctuate内部修改userStore。我们是否应该担心与此商店进行的任何放置/获取/删除操作上都会收到InvalidStateStoreException异常?

不。您可以安全地读取/写入商店。 InvalidStateStoreException将永远不会发生。 punctuate()process()由同一线程执行,并确保在调用punctuate()时存储已准备就绪。