我们希望执行一个region.getAll(keys)操作,以便并行处理值。这种行为主要希望强制cacheloader并行加载值。从cacheloader进行批量读取也是可行的,但我们不清楚如何向cacheloader传递getAll()中存在的其他密钥。如何使用geode并行获取值?
这是最好的在客户端处理或有其他geode API可以帮助吗?
我们希望执行一个region.getAll(keys)操作,以便并行处理值。这种行为主要希望强制cacheloader并行加载值。从cacheloader进行批量读取也是可行的,但我们不清楚如何向cacheloader传递getAll()中存在的其他密钥。如何使用geode并行获取值?
这是最好的在客户端处理或有其他geode API可以帮助吗?
Region.getAll(keys)
是一个顺序操作,对提供的Collection中的每个键单独进行迭代,并从区域获取值。如果您追踪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...
}
}
当您设置的Execution
,这是一组键的“Filter
”用“route“函数执行到包含这些”密钥“的集群中的数据节点,那么实际上,您已经(稍微)并行化了getAll
操作(当然,只有该节点上的密钥才是过滤器的一部分在这种情况下,即this)。
这个here可能是一个更好,更完整的例子。请参见“写入功能代码”部分。
您或许还应该阅读“How Function Execution Works”和PARTITION Regions。此外请注意...
应用程序需要对与键相关的数据执行操作。已注册的服务器端功能可以检索数据,对其进行操作并将其放回,并将所有处理都在本地执行到服务器。
这是这个page的第一个项目符号。
甚至可以将CacheLoader
关联到“逻辑”PARTITION区域,并且当在该函数内部进行提取并且数据不可用时,加载程序将(应当)在本地对该节点进行操作,因为它只是无论如何都要获取会转到该节点的KEYS(根据分区策略(默认情况下为“hash”))。
我还没有尝试过后,但我不明白为什么这不会在我的头顶上工作。
无论如何,希望这有助于!
-John