2.14. 代码执行和数据处理
分布式缓存的一个优点是,您可以利用每个主机的计算资源更有效地执行大型数据处理。通过在 Data Grid 上直接执行您的处理逻辑,您可以将工作负载分散到多个 JVM 实例中。您的代码也在数据存储数据的相同内存空间中运行,这意味着您可以更快地迭代条目。
对于您的 Data Grid 部署的性能影响,这完全取决于您的代码执行。更复杂的处理操作具有更高的性能降低,因此您应该通过仔细规划在 Data Grid 集群中运行的任何代码。首先测试您的代码并在较小的样本数据集上执行多个执行。收集了一些指标后,您可以开始识别优化,并了解您正在运行的代码的性能影响。
一个确定的是,长时间运行的进程可能会开始对正常读写操作造成负面影响。因此,您必须随着时间的推移监控部署并持续评估性能。
嵌入式缓存
借助嵌入式缓存,Data Grid 提供了两个 API,可让您在与数据相同的内存空间中执行代码。
ClusterExecutorAPI- 可让您通过缓存管理器执行任何操作,包括迭代一个或多个缓存的条目,并根据 Data Grid 节点处理。
CacheStreamAPI- 可让您对集合执行操作,并根据数据进行处理。
如果要在单一节点、一组节点或特定地区中的所有节点上运行操作,那么您应该使用集群执行。如果要运行一个可保证整个数据集的正确结果的操作,则使用分布式流更为有效的选项。
集群执行
ClusterExecutor clusterExecutor = cacheManager.executor();
clusterExecutor.singleNodeSubmission().filterTargets(policy);
for (int i = 0; i < invocations; ++i) {
clusterExecutor.submitConsumer((cacheManager) -> {
TransportConfiguration tc =
cacheManager.getCacheManagerConfiguration().transport();
return tc.siteId() + tc.rackId() + tc.machineId();
}, triConsumer).get(10, TimeUnit.SECONDS);
}
CacheStream
Map<Object, String> jbossValues =
cache.entrySet().stream()
.filter(e -> e.getValue().contains("JBoss"))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
远程缓存
对于远程缓存,Data Grid 提供了一个 ServerTask API,可让您通过 Hot Rod 调用 execute () 方法或使用 Data Grid 命令行界面(CLI)以编程方式注册自定义 Java 实现。您只能在一个 Data Grid 服务器实例或集群中的所有服务器实例上执行任务。