我们计划运行分布在两台机器上的kafka stream应用程序。每个实例都将其Ktable数据存储在自己的机器上。 我们面临的挑战是,
建议的解决方案: 我们正在考虑为这两个实例建立一个共享位置(state.dir)。因此,这两个实例将Ktable数据存储在同一目录中,其目的是通过调用从单个实例获取所有数据而无需交互式查询,
final ReadOnlyKeyValueStore<Key, Result> allDataFromTwoInstance =
streams.store("result",
QueryableStoreTypes.<Key, Result>keyValueStore())
KeyValueIterator<Key, ReconResult> iterator = allDataFromTwoInstance.all();
while (iterator.hasNext()) {
//append to excel report
}
问题: 以上解决方案是否可以正常运行?如果没有,有没有替代方案呢?
请建议。在此先感谢
答案 0 :(得分:2)
这不起作用。即使您有共享state.dir
,每个实例也只加载自己的数据共享/分片,并且不知道其他数据。
我认为您应该使用GlobalKTable来获取数据的完整本地副本。
答案 1 :(得分:2)
GlobalKTable是最自然的首选,但它意味着定义全局表的每个节点都包含整个数据集。
另一个想到的选择是确实按需在节点之间传输数据。这是有道理的,特别是如果创建报告是一种不频繁的操作或者数据集不能适合单个节点。基本上,您可以按照文档指南来查询远程Kafka Streams节点:
并且对于RPC使用支持流式传输的框架,例如阿卡-HTTP。
服务器端流媒体:
http://doc.akka.io/docs/akka-http/current/java/http/routing-dsl/source-streaming-support.html
使用流媒体响应: