Java 在GAE中,有没有一种方法可以强制实例只服务于一个会话?

Java 在GAE中,有没有一种方法可以强制实例只服务于一个会话?,java,swing,google-app-engine,canoo,Java,Swing,Google App Engine,Canoo,我正在使用卡诺的RIA套件在GAE上构建一个丰富的应用程序。这个包将JavaSwing组件分为服务器端和客户端两部分。在服务器上,它看起来像一个“桌面”Java应用程序。客户机在这两部分之间保留自己的地图。当GAE启动一个新实例时,客户端部分并不知道这一点——如果他们发送的下一个请求被路由到错误的实例,那么就会发生不好的事情 我想如果我做两件事中的一件,我可以绕过这个问题: 强制GAE实例只为一个HTTP会话提供服务 将每个HTTP请求定向到特定的GAE实例 我的问题是,在GAE环境中,这两个选

我正在使用卡诺的RIA套件在GAE上构建一个丰富的应用程序。这个包将JavaSwing组件分为服务器端和客户端两部分。在服务器上,它看起来像一个“桌面”Java应用程序。客户机在这两部分之间保留自己的地图。当GAE启动一个新实例时,客户端部分并不知道这一点——如果他们发送的下一个请求被路由到错误的实例,那么就会发生不好的事情

我想如果我做两件事中的一件,我可以绕过这个问题:

  • 强制GAE实例只为一个HTTP会话提供服务
  • 将每个HTTP请求定向到特定的GAE实例

  • 我的问题是,在GAE环境中,这两个选项中的任何一个都不能解决您的问题,因为应用程序引擎实例随时都可能死亡并被替换

    如果可以将服务器端“一半”的状态保存到数据存储中,则可以在请求命中“错误”实例时加载它,但这可能不是一个非常有效的解决方案


    您最好使用一个实例。

    我同意这两个选项都不适合您。当前设计的含义是将状态存储在一个实例的内存中,这不适用于GAE(或任何自动缩放分布式系统)。您应该将任何状态放入某个分布式数据存储中,无论是memcache(易失性)、数据存储还是cloudSQL

    GAE/J内置了对java会话的支持,会话状态在跨请求的数据存储中持久化,因此它在任何实例上都是有效的。要使其工作,会话中存储的所有内容都需要可序列化

    您可以通过以下方式启用此功能


    否则,您可以管理自己将服务器状态持久化到由memcache加速的数据存储中,并使用cookie将其链接到“会话”。如果您走这条路,请确保您了解GAE数据存储中最终一致性的含义。

    谢谢您的建议。我已经在HTTP会话对象中缓存了大部分GUI信息,在memcache中缓存了一些其他信息,在数据存储中还缓存了一些其他信息。如果我将挂起的延迟设置为一些相当高的数字,那么效果会很好。但是仍然有一些令人烦恼的情况,比如请求花费的时间太长,生成了一个新实例,或者(正如您所指出的)一个实例刚刚死亡(这些情况越来越少)。我不确定您为什么选择这个框架。我使用GWT,它是无状态的,没有任何此类问题。@Tony Carter您无法可靠地解决您描述的这些问题。您需要更改模型以处理消失的实例。这是appengine的基础。(除非您想为每个用户支付后端费用)