Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GAE/GWT服务器端数据在实例之间不一致/不持久_Java_Google App Engine_Gwt_Persistence - Fatal编程技术网

Java GAE/GWT服务器端数据在实例之间不一致/不持久

Java GAE/GWT服务器端数据在实例之间不一致/不持久,java,google-app-engine,gwt,persistence,Java,Google App Engine,Gwt,Persistence,我正在用GWT/Java在GAE上编写一个游戏应用程序,并且在服务器端持久数据方面遇到了问题。 玩家正在使用RPC轮询活动游戏和游戏状态,所有这些都是服务器上的存储。有时客户端轮询无法找到我知道应该存在的游戏实例。这只有在我部署到GoogleAppSpot时才会发生,在本地一切都很好 我理解这可能与appspot是一个云服务的方式有关,它可以在任何时候生成并使用我的servlet的新实例,并且现有数据不会在实例之间持久化 单个游戏只持续一两分钟,数据会快速变化(每秒多次),那么,确保对不同实例的

我正在用GWT/Java在GAE上编写一个游戏应用程序,并且在服务器端持久数据方面遇到了问题。 玩家正在使用RPC轮询活动游戏和游戏状态,所有这些都是服务器上的存储。有时客户端轮询无法找到我知道应该存在的游戏实例。这只有在我部署到GoogleAppSpot时才会发生,在本地一切都很好

我理解这可能与appspot是一个云服务的方式有关,它可以在任何时候生成并使用我的servlet的新实例,并且现有数据不会在实例之间持久化

单个游戏只持续一两分钟,数据会快速变化(每秒多次),那么,确保对不同实例的RPC调用将使用相同的服务器端数据的最佳方法是什么

我已经看过了数据存储API,它似乎是类似于数据库的存储,我猜这对于我所需要的东西来说太慢了。此外,Memcache可以在任何时候刷新,因此这是没有用的


我在这里遗漏了什么?

简短的回答:你没有将游戏设计为在App Engine上运行

听起来你好像已经回答了自己的问题。您知道数据不会跨实例持久化。在服务器端持久化数据的两种机制是memcache和datastore,但您也了解它们的局限性。你需要围绕这个来设计你的游戏

如果您没有使用memcache或数据存储,那么如何持久化数据(我的最佳猜测是您实际上没有持久化数据)。从模糊的细节来看,你还没有设计出能够在多个实例上运行的游戏架构,这对于在AppEngine上运行的任何应用都是必不可少的。这是一个基本的设计原则,您不知道任何HTTP请求将命中哪个实例。您必须重新构建才能使用datastore+memcache


如果要使用单个服务器,可以使用后端,其行为类似于固定的单个服务器(如果将其限制为一个实例)。坦率地说,由于成本的原因,如果你走这条路,你最好选择亚马逊或Rackspace。您还必须自己处理扩展问题-即如果游戏在特定服务器实例上运行,您需要构建一种方式,使玩游戏时始终命中该实例。

简短回答:您没有将游戏设计为在App Engine上运行

听起来你好像已经回答了自己的问题。您知道数据不会跨实例持久化。在服务器端持久化数据的两种机制是memcache和datastore,但您也了解它们的局限性。你需要围绕这个来设计你的游戏

如果您没有使用memcache或数据存储,那么如何持久化数据(我的最佳猜测是您实际上没有持久化数据)。从模糊的细节来看,你还没有设计出能够在多个实例上运行的游戏架构,这对于在AppEngine上运行的任何应用都是必不可少的。这是一个基本的设计原则,您不知道任何HTTP请求将命中哪个实例。您必须重新构建才能使用datastore+memcache


如果要使用单个服务器,可以使用后端,其行为类似于固定的单个服务器(如果将其限制为一个实例)。坦率地说,由于成本的原因,如果你走这条路,你最好选择亚马逊或Rackspace。您还必须自己处理扩展问题-即如果游戏在特定服务器实例上运行,您需要构建一种方式,使玩游戏时始终命中该实例。

这里有两个问题:在请求之间持久化数据和从客户端轮询数据

  • 当您有一个分布式servlet环境(如GAE)时,您不能向一个实例发出请求,将数据保存到内存中,并期望数据在其他实例上可用。对于GAE和任何其他具有多个服务器的servlet环境来说都是如此

    因此,您需要将数据保存到一些共享存储中:数据存储成本高、持久、可靠且速度慢。Memcache速度快、免费,但不可靠。通常我们将两者结合使用。有些库甚至透明地将这两者结合起来:

    在GAE上,还有第三个选项可以使用半持久化共享数据:。这些都是您控制启动/关闭的实例

  • 数据轮询:如果有多个客户端在等待更新,最好不要使用轮询。轮询将产生大量不必要的请求(服务器上的数据没有更改),并且仍然会有一个最小的延迟(因为您每隔一段时间轮询)。使用推送方式代替轮询。它甚至有GWT库:


  • 这里有两个问题:在请求之间持久化数据和从客户端轮询数据

  • 当您有一个分布式servlet环境(如GAE)时,您不能向一个实例发出请求,将数据保存到内存中,并期望数据在其他实例上可用。对于GAE和任何其他具有多个服务器的servlet环境来说都是如此

    因此,您需要将数据保存到一些共享存储中:数据存储成本高、持久、可靠且速度慢。Memcache速度快、免费,但不可靠。通常我们将两者结合使用。有些库甚至透明地将这两者结合起来:

    在GAE上,还有第三个选项可以使用半持久化共享数据:。这些都是您控制启动/关闭的实例

  • 数据轮询:如果有多个客户端在等待更新,最好不要使用轮询。轮询将产生大量不必要的请求(服务器上的数据没有更改),并且仍然会有一个最小的延迟(因为您每隔一段时间轮询)。使用推送方式代替轮询。它甚至有GWT库:


  • 请记住,您可以在不使用GAE的情况下部署GWT应用程序,请参见以下说明:

    你可能想要t