我们希望执行 region.getAll(keys) 操作,以便并行获取值。这种行为主要是为了强制缓存加载器并行加载值。从缓存加载器进行批量读取也可以,但不清楚我们如何将 getAll() 中存在的其他键传递给缓存加载器。
这是最好在客户端处理的事情,还是有其他可以提供帮助的 geode API?
我们希望执行 region.getAll(keys) 操作,以便并行获取值。这种行为主要是为了强制缓存加载器并行加载值。从缓存加载器进行批量读取也可以,但不清楚我们如何将 getAll() 中存在的其他键传递给缓存加载器。
这是最好在客户端处理的事情,还是有其他可以提供帮助的 geode API?
Region.getAll(keys)
是一个顺序操作,分别迭代提供的 Collection 中的每个键并从Region中获取值。如果你从源代码中追溯Region.getAll(keys)
,你最终会到达这里。
如果您的区域是一个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
操作(以及,在某种程度上,只有该节点上的键是该“上下文”中过滤器的一部分,即this)。
这里可能有一个更好、更完整的例子。请参阅“编写功能代码”部分。
您可能还应该阅读“函数执行的工作原理”和PARTITION Regions。还要注意这个...
应用程序需要对与键关联的数据执行操作。注册的服务器端函数可以检索数据、对其进行操作并将其放回原处,所有处理都在服务器本地执行。
这是此页面上的第一个项目符号。
您甚至可以将 a 关联CacheLoader
到“逻辑”分区区域,并且当在函数内部进行提取并且数据不可用时,加载器将(应该)在该节点本地操作,因为它只获取将去的 KEYS无论如何到那个节点(基于分区策略(默认情况下存储桶“哈希”)。
我没有尝试过后者,但我不明白为什么这在我的脑海中不起作用。
无论如何,希望这会有所帮助!
-约翰