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);
    }
}

但我对这个解决方案不太满意,字段是整数之类的。这也应该是一个很常见的问题。所以我在这里寻找的是这个问题的名称、模式、通用解决方案或库/框架。

4

3 回答 3

2

这里有两个问题。

  • 您是在复制客户端和服务器中的数据(如果是,为什么?)还是其中一个、另一个或数据库代理持有模型?
  • 每个代理如何访问(其/该)模型?

如果模型仅由一个代理(客户端、服务器、数据库)持有,那么其他代理需要一种远程查询模型(例如,各种字段的对象枚举器、getter 和 setter)在抽象模型实体(例如,模型元素标识符,可以像您所做的那样实现为整数)。

无论谁持有模型(一个或全部),每个模型都可以自然实现。正常的实现让每个对象都使用正常的对象引用简单地引用其他对象,就好像您在编写此代码时没有考虑在代理之间共享,并且与您所做的不同。

您可以将 objectid 与每个对象相关联,就像您一样,但您的应用程序代码不需要使用它;仅在引用模型的远程副本时才需要。此 objectid 是否与每个对象关联为特殊字段、哈希表或动态计算只是一个实现细节。

处理此问题的一种方法是即时计算 objectid。如果整个模型上存在规范生成树,则可以执行此操作。在这种情况下,objectid“只是”从生成树的根到对象位置的路径。如果您没有生成树或者计算成本太高,您可以在创建对象时分配 objectid。

正如您所建议的那样,重复的分布式模型的真正问题是让两个代理都对其进行更新,使其保持最新状态。您如何防止一个对象与另一个对象同时创建(分配一个objectid),但是创建的对象与相同的objectid不同,或者与不同的Objectids相同?您将需要远程锁定和信号来保持模型同步(这与多个 CPU 的“缓存一致性”问题相同;只需将每个对象视为缓存行)。通常解决的方法是指定谁拥有主副本(可能是整个模型,也可能是模型中的单个对象),然后发出查询、读取、带有修改意图的读取或写入以确保“独特”的整个模型得到更新。

于 2011-04-11T07:55:35.787 回答
0

我知道的唯一解决方案是通过网络发送完整的结构,即 Dogs 和 Persons。然后他们最终会指向网络另一端的正确副本。然而,该解决方案的实施取决于很多情况。例如,当您的包含关系定义一棵树时,您可以解决这个问题,而不是它是一个带循环的图。

看看这个以获取更多信息。

于 2011-04-11T07:33:57.050 回答
0

I guess one can use the proxy pattern for this.

于 2011-04-21T06:22:29.497 回答