我要使用IgniteRunnable执行大量的IgniteCompute。它们看起来如下:

public class MyIgniteRunnable implements IgniteRunnable{

    private Sting value;
    private String key;

    public MyIgniteRunnable(String key, String value){
         this.key = key;
         this.value = value;
    }

    public void run{

        IgniteCache<String, String> cache = Ignition.localIgnite().getOrCreateCache("cache");
        String previous = cache.get(key);
        String result;
        //process previous and value
        cache.put(key, result); //<------ Here

    }

}


我将按以下方式使用它:

Ignite ignite;
String key;
String value;
//...
IgniteCompute compute = ignite.compute();
compute.affinityRun("cache", key, new MyIgniteRunnable(key, value));


但是我不确定在任务中使用put是否正确。我以为,由于我将affinityRunkey一起使用,因此每个任务都将在“正确”的节点上执行,因此put可以,因此不会增加额外的序列化/网络开销。

这种方法是正确的还是有更有效的方法呢?

我没有使用流式传输,因为每个任务中只有一个要放入缓存的元素。

最佳答案

如果您需要基于缓存的值执行某些逻辑,那么您的方法是正确的,并且可能是最简单的。执行逻辑的最佳方法是在存储密钥的节点上。因为您使用的是affinityRun(...),所以缓存放置操作将是本地的,并且不会有多余的网络流量。

另一方面,您也可以使用DataStreamer,它应该可以提供更好的性能,但是对于必须在服务器端执行一些并置逻辑的情况则有些复杂。看一下此处记录的StreamReciever,StreamTransformer和StreamVisitor:https://apacheignite.readme.io/docs/data-streamers

10-05 18:30