2016-11-14 5 views
1

일관된 캐시에 액세스하는 단일 JAVA 프로세스가있는 여러 노드 (최대 30 개)로 구성된 복제 된 클러스터가 있고 에이전트 생성 및 업데이트에 map.invoke (key, agent) 메소드를 사용합니다. 생성 및 갱신은 process 메소드의 값 설정으로 수행됩니다. 나는 업데이트가 만든 경우 것으로 나타났습니다Oracle의 일관성 : 특정 노드에서 에이전트를 강제로 호출 할 수있는 방법이 있습니까?

public Object process(Entry entry) { 
    if (entry.isPresent()) 
    { 
    //UPDATE 
    ... some stuff which compute the new entry value... 
    entry.setValue(newValue, true); 
    return newValue 
    } 
    else 
    { 
    //CREATION 
    ..other stuff to determine the value... 
    entry.setValue(value, true); 
    return value; 
    } 
} 

: 에이전트 개체의 다음 코드를 호출

map.invoke(key, agent); 

:

예 (에이전트는 EntryProcessor 인터페이스를 구현하는 ConcreteEntryProcessor의 인스턴스입니다) 좋은 성능을 가진 에이전트를 만든 노드 그렇지 않으면 업데이트가 다른 노드에서 이루어진 경우 성능이 저하됩니다. 데이터 소유권의 종류가있는 것 같습니다.

로컬 노드에서 강제로 에이전트를 실행하거나 데이터 소유권을 변경하는 방법이 있습니까?

+0

"나는 에이전트 생성 및 업데이트에'map.invoke (key, agent)'메소드를 사용합니다. 이 경우'agent'는'key'에 의해 지정된 캐시 엔트리에서 작동하는'EntryProcessor'의 인스턴스이고'map.invoke'로 에이전트 ('EntryProcessor's)를 생성/업데이트하는 방법을 이해하지 못합니다. 지금까지 시도한 것에 대한 몇 가지 예를 보여주십시오. –

+0

귀하의 의견에 답하기 위해 질문을 수정했습니다 .. – Fernando

답변

0

모두 캐시 구성에 따라 다릅니다. 분산 (파티션 된) 캐시를 사용하면 실제로 어떤 종류의 데이터 소유권이 있습니다. 이 경우 엔트리 프로세서는 주어진 키를 소유 한 노드에서 호출됩니다.

그리고 당신의 성능 문제에 따라, 나는 두 가지 가능성을 참조하십시오 map.invoke(key, agent) 감소의

  1. 성능을하지만, EntryProcessor.process(entry)의 성능은 안정적이다. 이 경우 성능 문제는 아마도 map.invoke(key, agent)을 호출 한 노드로 처리 결과를 보내기 위해 필요한 직렬화 및 네트워크 트래픽 때문에 발생합니다. 노드에서이 값을 필요로하지 않으면 간단히 엔트리 프로세서에서 null을 반환하십시오.

  2. 성능은 EntryProcessor.process(entry)입니다. 이 경우 mayby ​​생성/업데이트 논리 map.invoke(key, agent)라는 노드에서 일부 데이터가 필요합니다. 따라서 다시 직렬화/네트워크 트래픽 문제이지만 특정 논리의 세부 사항을 알지 못하면 문제에 대한 해결책을 찾기가 어렵습니다.