2013-10-29 5 views
2

Hazelcast 분산 실행의 개념을 이해하는 데 문제가 있습니다. 특정 키의 소유자 인스턴스에서 실행을 수행 할 수 있다고합니다. 문서에서
:Hazelcast 분산 Executor 서비스 KeyOwner

<T> Future<T> submitToKeyOwner(Callable<T> task, Object key) 
    Submits task to owner of the specified key and returns a Future representing that task. 
     Parameters: 
      task - task 
      key - key 
     Returns: 
      a Future representing pending completion of the task 

나는 (다음 설치를 따라 예를 들어 뭔가를) 다른 개체를 잡고, 실제로 서로 다른 목적을 위해 동일한 키를 사용할 수있는 여러지도를 내장 클러스터가 혼자가 아니에요 있다고 생각 :

IMap<String, ObjectTypeA> firstMap = HazelcastInstance.getMap("firstMap"); 
IMap<String, ObjectTypeA_AppendixClass> secondMap = HazelcastInstance.getMap("secondMap"); 

내게는 설명서가 키 소유자에 대해 말하는 것이 혼란스러워 보입니다. 나의 진정한 좌절감은 내가 알 수없는 것인데 - 어떤지도에서 - 열쇠가 그것을 가리키는 지? Hazelcast MultiHTML Documentation 3.0 - Distributed Execution
너희들 중 하나가 무슨 키를 원하는가 과거에 알아낼나요 :

여기
import com.hazelcast.core.Member; 
import com.hazelcast.core.Hazelcast; 
import com.hazelcast.core.IExecutorService; 
import java.util.concurrent.Callable; 
import java.util.concurrent.Future; 
import java.util.Set; 
import com.hazelcast.config.Config; 

public void echoOnTheMemberOwningTheKey(String input, Object key) throws Exception { 
    Callable<String> task = new Echo(input); 
    HazelcastInstance hz = Hazelcast.newHazelcastInstance(); 
    IExecutorService executorService = hz.getExecutorService("default"); 
    Future<String> future = executorService.submitToKeyOwner(task, key); 
    String echoResult = future.get(); 
} 

이 문서 사이트에 대한 링크입니다 :
문서는 또한이 방법의 "데모"제공?

답변

1

아마도 더 나은 코드 예제와 함께 설명 할 수 있습니다 : 당신이 볼 수 있듯이

Callable<String> task = new Echo(input); 

    String key = "foo"; 
    IMap map1 = hz.getMap("m1"); 
    IMap map2 = hz.getMap("m2"); 
    map1.put(key,1); 
    map2.put(key,2); 

    IExecutorService executorService = hz.getExecutorService("default"); 
    Future<String> future = executorService.submitToKeyOwner(task, key); 
    String echoResult = future.get(); 

2 개지도, MAP1 및 MAP2있다.

이 두 맵은 'foo'키가 같지만 값이 다른 맵 항목이 있습니다.

그러나이 두 맵 항목은 키를 사용하여 파티션을 결정하기 때문에 동일한 파티션 (결국 같은 구성원)에 저장됩니다.

마지막 줄에서 작업이 키 소유자에게 전송됩니다.이 경우 키 'foo'를 소유 한 멤버에게 작업을 보냅니다. 따라서 작업은 두 맵 항목이 저장된 위치와 동일한 시스템으로 전송됩니다.

지원에 관한 토론을 확인하지 않았습니다. 이것은 스택 오버플로에 게시 한 원래 질문에 대한 대답입니다.

0

Hazelcast에서는 데이터를 분할 할 수 있으며 키가 사용됩니다.

예. 같은 키를 사용하는 2 개의 맵이있을 때, 그 키에 대한 맵 항목은 두 개의 맵에 대해 동일한 파티션에 배치됩니다.

어떤지도가 사용되고있는 것은 그리 중요하지 않습니다.

executor를 사용하여 해당 파티션을 소유 한 구성원에게 작업을 보낼 수 있습니다.

이 질문에 대한 답변을 보내 주시면보다 자세한 정보를 요청할 수 있습니다.

+0

그건 전혀 의미가 없습니다. 글쎄, 적어도 나는이 행동에서 이점을 안다. 어제 Hazelcast 지원팀과 함께이 문제에 대해 논의하면서 내 문제에 대한 해결책이 드러났습니다. 별도의 IMap을 사용하여 내가 찾고있는 objectId에 대한 객체가있는 hazelcast 인스턴스의 ID를 저장해야합니다. 이 방법을 사용하면, OOMember (HazelcastInstance.getMembers(). get (id))를 실행할 수 있습니다. –