2017-05-18 5 views
1

私はIgniteRunnableの大量を持ち、IgniteComputeで実行します。次のように彼らは見て次のようにそれを使用しようとしてIgnite putとDataStreaming

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を使用して行うには正しいことであるかどうかわかりません。私はkeyaffinityRunを使用しているので、各タスクは "正しい"ノードで実行されるので、putは大丈夫だと思っていました。

このアプローチは正しいですか、これを行うにはもっと効率的な方法がありますか?

キャッシュに入れる各タスクに要素が1つしかないので、ストリーミングを使用しませんでした。

答えて

2

キャッシュされた値に基づいてロジックを実行する必要がある場合は、正しい方法で、おそらく最も簡単です。ロジックを実行する最善の方法は、キーを格納するノード上です。 affinityRun(...)を使用しているため、キャッシュのput操作はローカルになり、冗長なネットワークトラフィックは発生しません。

一方、パフォーマンスを向上させるはずのDataStreamerも使用できますが、サーバー側でいくつかのコロケートされたロジックを実行する必要がある場合はもう少し複雑です。ここに記載されているStreamReciever、StreamTransformer、およびStreamVisitorをご覧ください。https://apacheignite.readme.io/docs/data-streamers

+0

この場合、dataStreamerのパフォーマンスについてはわかりませんでした。私はストリームトランスについて知っています。ロジックを実行するためには、キャッシュ要素を取得する必要があります。だから私はネットワークを介して一度だけ適切なノードにタスクを送信し、取得し、処理し、配置したい(すべての操作はローカル)。 –

+0

ストリーム・レシーバーは既に適切なノードで実行されているため、追加のネットワーク・トラフィックとシリアライゼーションは不要です。 –

+0

右側のノードでストリーム受信者が実行されます。 – Dmitriy