我正在使用Canoo的RIA Suite在GAE上构建一个丰富的应用程序。该软件包将Java Swing组件拆分为服务器端和客户端组件。在服务器上,它看起来像一个“桌面”Java应用程序。客户端在这两半之间保留自己的映射。当GAE启动一个新实例时,客户端部分不知道它 - 如果他们发送的下一个请求被路由到错误的实例,则会发生坏事。
我认为如果我做了两件事之一,我可以解决这个问题:
我的问题是,在GAE环境中,可以完成其中任何一项吗?
答案 0 :(得分:1)
这两个选项都不能解决您的问题,因为App Engine实例可能随时死亡并被替换。
如果您可以在数据存储区中保存服务器端“half”的状态,则可以在请求到达“错误”实例时加载它,但它可能不是一个非常有效的解决方案。
使用Compute Engine实例可能会更好。
答案 1 :(得分:0)
我同意这两个选项都不适合你。您当前设计的含义是您将状态存储在实例的内存中,这不适用于GAE(或任何自动扩展分布式系统)。您应该将任何状态放入某个分布式数据存储中,无论是memcache(易失性),数据存储区还是cloudSQL
GAE / J内置了对java会话的支持,会话状态在请求中持久存储在数据存储区中,因此它在任何实例上都有效。为此,存储在会话中的所有内容都需要序列化。
您可以按照these instructions启用此功能。
否则,您可以将自己的持久服务器状态管理到由memcache加速的数据存储区中,并将其链接到带有cookie的“会话”。如果您走这条路,请确保您了解GAE数据存储中最终一致性的含义。