2017-07-31 97 views
0

我们希望执行一个region.getAll(keys)操作,以便并行处理值。这种行为主要希望强制cacheloader并行加载值。从cacheloader进行批量读取也是可行的,但我们不清楚如何向cacheloader传递getAll()中存在的其他密钥。如何使用geode并行获取值?

这是最好的在客户端处理或有其他geode API可以帮助吗?

回答

1

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

相关问题