5

동일한 모델/객체를 공유/동기화하려는 클라이언트와 서버가 있다고 가정 해 보겠습니다. 모델은 서로를 가리키고 클라이언트와 서버간에 전송/직렬화 된 후에 동일한 객체를 계속 가리 키기를 원합니다.네트워크를 통해 객체를 보내고 포인터를 유지하기위한 패턴/라이브러리

class Person { 
    static Map<Integer,Person> allPeople; 
    int myDogId; 

    static Person getPerson(int key){ 
     return allPeople.get(key); 
    } 

    Dog getMyDog() { 
     return Dog.getDog(myDogId); 
    } 
} 

class Dog { 
    static Map<Integer,Dog> allDogs; 
    int myOwnersId; 

    static Dog getDog(int key) { 
     return allDogs.get(key); 
    } 

    Person getMyOwner() { 
     return Person.getPerson(myOwnersId); 
    } 
} 

하지만 난 필드 정수 물건되고,이 솔루션 너무 만족하지 않다 : 나의 현재 솔루션은 대략 다음과 같습니다. 이것은 또한 꽤 일반적인 문제가되어야합니다. 그래서 내가 여기서 찾고있는 것은이 문제, 패턴, 일반적인 해결책 또는 라이브러리/프레임 워크의 이름입니다.

+0

btw. 나는 [정적 패턴] 기술의 이름이 [multiton pattern] (http://en.wikipedia.org/wiki/Multiton)이라는 것을 알게되었습니다. – kornfridge

답변

2

여기에는 두 가지 문제가 있습니다.

  • 당신은 클라이언트와 서버의 데이터를 복제 (그렇다면, 왜?) 또는 데이터베이스 에이전트가 모델을 유지 하나, 다른, 또는 을합니까?
  • 각 에이전트는 어떻게 모델에 액세스합니까?

모델은 하나의 에이전트 (클라이언트, 서버, 데이터베이스), 다음 다른 에이전트 이 필요로하는 원격으로 모델을 조회 할 수있는 방법에 의해 유지되는 경우 (예를 들어, 다양한 분야에 대한 열거, getter 및 setter 개체) 추상적 모델 엔티티에서 작동합니다 (예 : 모델 요소 식별자, 이는 수행 한대로 정수로 으로 구현 될 수 있음).

누가 모델을 보유하고 있는지에 관계없이 (하나 또는 모두) 각 모델을 자연적으로 구현할 수 있습니다. 일반적인 구현은 각 개체는 단순히 에이전트 간의 공유의 생각없이 코딩했다 것처럼, 일반 객체 참조를 사용하여 다른 개체를 참조하고, 당신이 무슨 짓을했는지는 달리이있다.

당신이 가지고 있지만, 응용 프로그램 코드를 사용하지 않기 때문에 당신은 각 객체에 OBJECTID를 연결할 수 있습니다

; 모델 의 원격 사본을 참조 할 때만 필요합니다. 이 objectid가 각 객체와 특수 필드 또는 해시 테이블과 연결되어 있는지 여부는 구현 세부 사항 일뿐입니다.

이 문제를 처리하는 한 가지 방법은 직접 작성하는 것입니다. 전체 모델에 대해 표준 스패닝 트리가있는 경우 을 수행 할 수 있습니다. 이 경우, ObjectId가이 위치 개체의 에 스패닝 트리의 루트에서 "그냥"경로입니다. 당신은 스패닝 트리가 없거나은 계산하기에 너무 비싼 경우 오브젝트가 작성 될 때, 당신은하며 Object 할당 할 수 있습니다.

당신이 제안한 것처럼 복제 된 분산 모델의 실질적인 문제는 두 에이전트가 모두 업데이트하여 최신 상태로 유지하는 것입니다. 하나가 객체 (객체 ID 할당)를 다른 객체와 동시에 생성하지 못하게하려면 어떻게합니까? 그러나 생성되는 객체는 동일한 객체 ID 또는 다른 객체 ID와 동일하지 않습니까? 원격 잠금 과 신호를 동기화하여 모델을 동기화 상태로 유지해야합니다 (이는 여러 CPU에 대해 "캐시 일관성"과 동일한 문제이며 각 개체가 캐시 라인과 같은 역할을한다고 생각하면됩니다). 일반적으로 을 해결하는 방법은 마스터 복사본 (모델 내의 개별 개체 등)을 보유한 사람을 지정하고 쿼리를 실행하는 것입니다. 읽는 중, 의도하는 것으로 읽는 중 또는 "고유 한"전체 모델이 업데이트되도록 을 작성합니다.

0

제가 알고있는 유일한 해결책은 전체 구조, 즉 개와 사람을 네트워크를 통해 보내는 것입니다. 그런 다음 네트워크의 다른 쪽에서 올바른 사본을 가리 키도록됩니다. 그러나이 솔루션의 구현은 많은 환경에 달려 있습니다. 예를 들어, 포함 관계가 트리를 정의 할 때주기가있는 그래프 인 경우와 다르게이 문제를 다룰 수 있습니다.

자세한 내용은 this을 참조하십시오.

관련 문제