0

我们希望执行 region.getAll(keys) 操作,以便并行获取值。这种行为主要是为了强制缓存加载器并行加载值。从缓存加载器进行批量读取也可以,但不清楚我们如何将 getAll() 中存在的其他键传递给缓存加载器。

这是最好在客户端处理的事情,还是有其他可以提供帮助的 geode API?

4

1 回答 1

1

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...
  }
}

当您在 上设置一个“ FilterExecution,这是一组键,用于将函数执行“路由”到包含这些“键”的集群中的数据节点,那么实际上,您已经(在某种程度上)并行化了getAll操作(以及,在某种程度上,只有该节点上的键是该“上下文”中过滤器的一部分,即this)。

这里可能有一个更好、更完整的例子。请参阅“编写功能代码”部分。

您可能还应该阅读“函数执行的工作原理”和PARTITION Regions。还要注意这个...

应用程序需要对与键关联的数据执行操作。注册的服务器端函数可以检索数据、对其进行操作并将其放回原处,所有处理都在服务器本地执行。

这是此页面上的第一个项目符号。

您甚至可以将 a 关联CacheLoader到“逻辑”分区区域,并且当在函数内部进行提取并且数据不可用时,加载器将(应该)在该节点本地操作,因为它只获取将去的 KEYS无论如何到那个节点(基于分区策略(默认情况下存储桶“哈希”)。

我没有尝试过后者,但我不明白为什么这在我的脑海中不起作用。

无论如何,希望这会有所帮助!

-约翰

于 2017-07-31T16:26:47.900 回答