我非常热衷于点燃并对客户端和服务器节点的责任有疑问。据我所知,客户端节点是非常小的机器,因此执行一些繁重的缓存操作并不是他们的目的。例如,我需要从一些持久性存储加载数据,执行一些繁重的缓存相关计算并将结果数据放入缓存。它看起来像这样:
我
//This is on a client node
public class Loader{
private DataSource dataSource;
@IgniteInstanceResource
private Ignite ignite;
public void load(){
String key;
String values;
//retreive key and value from the dataSource
IgniteDataStreamer<String, String> streamer = ignite.dataStreamer("cache");
String result;
//process value
streamer.addData(key, result); //<---------1
}
}
问题是关于//1
。客户端负责处理加载的数据并将其放入缓存吗?我实际上打算执行以下操作:为每个加载的String key
和String value
创建任务,并在服务器节点上执行所有评估和缓存相关的操作。如下所示:
II。
public class LoaderJob extends ComputeJobAdapter{
private String key;
private String value;
@Override
public Object execute(){
//perform all computation and putting into cache here
//and return Tuple2(key, result);
}
}
public class LoaderTask extends extends ComputeTaskSplitAdapter<Void, Void {
//...
public Void reduce(List<ComputeJobResult> results) throws IgniteException {
results.stream().forEach(result -> {
Tuple2<String, String> jobResult = result.getData();
ignite.dataStreamer("cache").addData(jobResult._1, jobResult._2);
});
return null;
}
}
在第二种情况下,客户端正在做的只是从持久性存储加载数据,然后在服务器上发布任务。
这样做的常见方式是什么?
答案 0 :(得分:2)
自己为一些数据创建专门的工作,这是个坏主意。这样的事情在流媒体中做(数据将被缓冲并发送到将存储的特定节点)。
客户端节点是非常小的机器,因此执行一些繁重的缓存操作不是它们的目的
这不是一个真实的陈述。您可以为客户端JVM提供足够的资源来加载数据。
您应该在客户端创建一个数据流,并从该计算机加载数据。流媒体实例也是线程保存,因此您可以同时从某些线程加载日期。
答案 1 :(得分:2)
这取决于数据量和计算复杂性。如果数据量很大,您可以直接从服务器加载数据,而无需使用客户端。
Here是DataStreamer最简单的示例,您只需要在持久存储中添加加载数据并在使用DataStreamer之前进行计算。
此外,它还取决于其他因素,如客户端配置(CPU,RAM,网络)以及客户端和服务器节点之间的连接。如果客户端具有良好的配置,例如,作为服务器,并且它与服务器节点位于同一网络中,则在客户端上进行加载和计算并且仅在将数据流式传输到缓存之后,这不是问题。
答案 2 :(得分:1)
IgniteDataStreamer是在缓存中加载数据的最快方法。所以,第一种情况是有效的。
我认为,如果从服务器节点上的持久性存储中收集数据并且客户端仅发送加载参数,则第二种情况是有意义的。