2017-05-18 1 views
1

나는 많은 사람이 IgniteRunnable임이 IgniteCompute으로 실행됩니다. 작업에 put 옳은 일이라고 사용하는 경우Ignite put 대 DataStreaming

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

을하지만 임 확실하지 :

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 

    } 

} 

임은 다음과 같이 사용하려고 다음과 같이 그들은 본다. 나는 key과 함께 affinityRun을 사용했기 때문에 각 작업이 "올바른"노드에서 실행될 것이므로 put은 괜찮습니다. 추가/직렬화/네트워킹 비용이 들지 않습니다.

이 방법이 맞습니까? 아니면이 방법을 사용하는 것이 더 효율적입니까?

각 작업마다 캐시에 넣을 요소가 하나뿐이기 때문에 스트리밍을 사용하지 않았습니다.

답변

2

캐시 된 값을 기반으로 일부 논리를 실행해야하는 경우 올바른 방법과 가장 간단한 방법이 있습니다. 논리를 실행하는 가장 좋은 방법은 키를 저장하는 노드에 있습니다. affinityRun (...)을 사용하고 있기 때문에 캐시 넣기 작업은 로컬 일 것이며 중복 네트워크 트래픽이 없습니다.

반면에 더 나은 성능을 제공하는 DataStreamer를 사용할 수도 있지만 서버 측에서 일부 공동 논리를 실행해야하는 경우에는 좀 더 복잡합니다. 여기에 설명 된 StreamReciever, StreamTransformer 및 StreamVisitor를 살펴보십시오. https://apacheignite.readme.io/docs/data-streamers

+0

이 경우에 dataStreamer의 성능에 대해 확신 할 수 없었습니다. 스트림 변압기에 대해 알고 있습니다. 위해서는 일부 논리를 실행하려면 캐시 요소를 얻을 필요가있다. 그래서 네트워크를 통해 한 번만 올바른 노드로 작업을 보내고 처리하고 넣었 으면합니다 (모든 작업은 로컬입니다). –

+0

또는 스트림 수신기가 올바른 노드에서 이미 실행되었으므로 추가 네트워크 트래픽 및 직렬화 비용이 들지 않습니까? –

+0

스트림 수신기는 오른쪽 노드에서 실행됩니다. – Dmitriy