【发布时间】:2019-07-03 05:31:16
【问题描述】:
我的用例是获取 Kafka 主题中 any 键的最新值。为此,我目前正在使用 GlobalStateStore。
问题是,如果每个实例都有不同的application.id,则会创建不同的状态目录。
我想要的是在所有实例中重用现有的状态存储目录以避免重复数据。 这是因为,我所有的应用程序实例都运行在同一台机器上,所以没有不同的状态目录。
我做了以下事情:
使用相同的 application.id 并创建 2 个流实例, 2 个实例指向同一个 state.dir 但状态存储实例不同(java 对象不同)statestore1 和 statestore2
然后作为测试,我做了以下事情:
while(true)
{
new Thread(()-> stateStore1.get(key)).start();
new Thread(()-> stateStore2.get(key)).start();
}
然后我开始在主题中产生价值......
我观察到所有状态存储实例(statestore1 和 statestore2)都在更新同一个状态存储(即相同 state.dir)(因为那是代码)
我在测试中没有遇到任何问题。但是..我想在将数据写入state.dir之前应该获取一个写锁。 现在,如果由于某种原因 statestore1 没有释放锁,那么 statestore2 会一直等待吗?
我上面的方法是安全还是有其他方法?
更新:
用例是我希望在不同的进程(不同的 JVM 实例)之间共享一些公共数据。由于数据是通用的,因此不需要为每个进程都有一个全局存储(因为它是多余的)。
所有进程都应该能够读取和写入该存储,因为每个进程都是相互独立的。 因此,如果一个进程出现故障,另一个进程可以完成它的工作(将最新值存储在全局存储中并在需要时获取它)。
【问题讨论】:
标签: apache-kafka apache-kafka-streams