从多个客户端更新服务器上的对象的模式/最佳实践

时间:2014-02-05 13:55:23

标签: java design-patterns

我有一个关于解决问题的最佳实践或模式的一般性问题。

考虑在单独的JVM上运行三个程序:Server,Client1和Client2。

所有三个进程都会对对象进行更改。在任一客户端中更改对象时,必须将对象(而不是新对象)中的更改发送到服务器。不可能只是将新对象从客户端发送到服务器,因为两个客户端可能同时更新对象,因此我们需要增量,而不是结果。

我并不担心此时将服务器上的更改反馈给客户,但我们可以考虑这个问题。

使用X个进程和Y个可能更改的对象类实现此操作的最佳实践是什么?

我能想到的最好方法是始终使用Command模式同时更改客户端和服务器上的对象,但必须有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

解决这个问题的可能方法之一是Java中的Remote Method Invocation系统。将所有数据值保留在服务器上,然后让客户端使用远程调用来查询它们。

然而,这需要一些智能缓存来减少无意义的呼叫量。最后,你最终会得到与命令模式类似的东西。

现代游戏尝试用我称之为Execute-Then-Verify模式的东西来解决这个问题,其中每个客户都有游戏世界的本地副本,这使得他可以得到与每个动作相同的结论。服务器会。所以玩家的动作应用于游戏世界的本地副本,假设它们是正确的,然后将它们发送到服务器,这是接受或稍后撤销它的最终实例。

本地缓存的这种变体的好处是,大多数玩家不会经历太多延迟,但是在相互矛盾的行动中他们可能会遇到众所周知的回滚。

最后,它在很大程度上取决于您要做的事情以及对您来说更重要的事情:控制行动或客户行动流程。