了解客户端和服务器

Understanding clients and servers

我对 ignite 还很陌生,对客户端和服务器节点的责任有疑问。据我从文档中了解到,客户端节点是非常小的机器,因此执行一些繁重的缓存操作并不是它们的目的。例如,我需要从某个持久性存储加载数据,执行一些与缓存相关的繁重计算并将结果数据放入缓存中。它看起来像这样:

我.

//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 keyString value 创建任务,并在服务器节点上执行所有评估和缓存相关操作。像下面这样:

二.

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

在第二种情况下,客户端所做的只是从持久存储中加载数据,然后在服务器上发布任务。

通常的做法是什么?

IgniteDataStreamer 是在缓存中加载数据的最快方式。所以,第一种情况是有效的。

我认为,如果从服务器节点上的持久存储中收集数据并且客户端仅发送加载参数,则第二种情况是有意义的。

自己为一些数据创建专门的工作,是个坏主意。在 streamer 中做这样的事情(数据将被缓冲并发送到将被存储的特定节点)。

client nodes are very small machines, so it's not their purpose to perform some heavy cache operations

这不是真实的陈述。您可以为客户端 JVM 提供足够的资源来加载数据。

您应该在客户端创建一个数据流,并从这台机器加载数据。另外 streamer 实例是线程保存的,所以你可以同时从一些线程加载数据。

这取决于数据量和计算复杂度。如果数据量很大,您可以直接从服务器加载数据,而无需使用客户端。

Here是DataStreamer最简单的例子,你只需要从你的持久化存储中添加加载数据并进行计算就可以使用DataStreamer。

此外,它还取决于其他因素,例如客户端配置(CPU、RAM、网络)以及客户端和服务器节点之间的连接。如果client有很好的配置,比如作为server,和server节点在同一个网络,那么在client上加载和计算是没有问题的,只有在它流式传输数据到缓存中。