我们想执行region.getAll(keys)操作,以便并行处理这些值。此行为主要是为了强制缓存加载器并行加载值。从缓存加载器批量读取也可以工作,但我们不清楚如何向缓存加载器传达getAll()中存在的其他密钥。
这是最好在客户端处理的还是其他可以提供帮助的geode API?
答案 0 :(得分:1)
Region.getAll(keys)
是一个顺序操作,分别迭代所提供的Collection中的每个键,并从 Region 中获取值。如果您追踪Region.getAll(keys)
的源代码,则最终会到达here。
如果您的区域是PARTITION
区域(强烈推荐),您可以利用Geode的并行功能执行,类似......
Region<?, ?> myPartitionRegion = ...
...
Set<KEY> keysOfInterests = ...
...
Execution functionExecution = FunctionService.onRegion(myPartitionRegion)
.withFilter(keysOfInterests)
.withArgs(...);
ResultCollector<?, ?> results = functionExecution.execute("myFunctionId");
// process the results.
然后你的功能实现......
class MyOnRegionFunction extends FunctionAdapter {
public void execute(FunctionContext context) {
assert context instanceOf RegionFunctionContext :
String.format("This Function [%s] must be executed on a Region",
getId());
RegionFunctionContext regionContext = (RegionFunctionContext) context;
Region<K, V> localData =
PartitionRegionHelper.getLocalDataForContext(regionContext);
Map<K, V> results = localData.getAll(regionContext.getFilter());
// do whatever with results; e.g. send back to caller...
}
}
在Filter
上设置“Execution
”,这是一组用于“路由”的键,功能执行到群集中的数据节点包含那些“键”,然后实际上,你(某种程度上)并行化getAll
操作(好吧,只有那个节点上的键只是那个“上下文”中Filter的一部分,即{{3 }})。
可能有一个更好,更完整的例子this。请参阅“编写功能代码”部分。
您可能还应该阅读“ here ”和How Function Execution Works。还要注意这个......
应用程序需要对与密钥关联的数据执行操作。注册的服务器端功能可以检索数据,对其进行操作并将其放回,所有处理都在本地执行到服务器。
这是PARTITION Regions上的第一个项目符号。
您甚至可以将CacheLoader
关联到“逻辑”PARTITION区域,并且当在函数内部进行提取并且数据不可用时,加载器将(应该)在本地操作到该节点无论如何它只会获取到该节点的KEYS(基于分区策略(默认情况下为“hash”))。
我没有尝试过后者,但我不明白为什么这不会起作用。
无论如何,希望这有帮助!
-John