Google app engine 需要来自同一客户端的所有请求转到同一实例

Google app engine 需要来自同一客户端的所有请求转到同一实例,google-app-engine,Google App Engine,我在GoogleAppEngine中部署了一个基于GWT的JavaWeb应用程序,其中servelet读取并更改内存中的状态。客户端代码可能会发送更改此状态的请求,并随后发送更改或读取相同状态的请求。因此,来自客户机页面的同一实例的所有请求都转到应用程序版本的同一实例,这一点很重要 因为我不期望有很多流量,所以我不介意将实例的最大数量限制为1。但我希望有一个实例或多或少是永久存在的。(如果用户在两次请求之间花费的时间超过(比如)一个小时,我不介意他们的数据是否丢失。) 具体地说,我管理状态的方式

我在GoogleAppEngine中部署了一个基于GWT的JavaWeb应用程序,其中servelet读取并更改内存中的状态。客户端代码可能会发送更改此状态的请求,并随后发送更改或读取相同状态的请求。因此,来自客户机页面的同一实例的所有请求都转到应用程序版本的同一实例,这一点很重要

因为我不期望有很多流量,所以我不介意将实例的最大数量限制为1。但我希望有一个实例或多或少是永久存在的。(如果用户在两次请求之间花费的时间超过(比如)一个小时,我不介意他们的数据是否丢失。)

具体地说,我管理状态的方式是,我有一个指向哈希表的静态变量,哈希表将字符串映射到状态。在客户端的第一个请求中,将创建一个新的唯一字符串,并在哈希表中创建一个新状态和一个新条目。字符串将在响应中返回。在后续请求中,客户机发送字符串,以便Servlet可以找到需要修改或读取的状态。我不能将状态保存在数据库中,因为它非常复杂,而且根本不可序列化

如何确保来自给定客户端实例的所有请求都转到同一服务器实例?

如何确保来自给定客户端实例的所有请求转到同一服务器实例

这是没有办法的。如果希望可靠地在请求之间保持状态,请使用数据存储,并将memcache作为缓存

添加:如果您的数据存储不足,您也可以使用cookie,根据需要对其进行模糊/加密

应用程序引擎假定应用程序在请求之间不保持基本状态。这使得启动/关闭实例不再成为问题。

如何确保来自给定客户端实例的所有请求都转到同一服务器实例

这是没有办法的。如果希望可靠地在请求之间保持状态,请使用数据存储,并将memcache作为缓存

添加:如果您的数据存储不足,您也可以使用cookie,根据需要对其进行模糊/加密


应用程序引擎假定应用程序在请求之间不保持基本状态。这使得启动/关闭实例不再是问题。

我支持Dave的回答,GAE并不完全适合您的需求

然而,可以有办法解决这个问题,但只有在少数特定情况下:如果您使用标准GAE环境并手动扩展,并且后续请求总是基于嵌入在对前一个请求的响应中的URL

您可以根据目标路由规则在响应请求时手工创建URL,以便后续请求命中同一实例。发件人:

  • 如果您仍在使用或拥有,则可以通过 包括实例ID。实例ID是范围内的整数 从0到正在运行的实例总数,并且可以 具体规定如下:
向特定实例中的特定服务和版本发送请求:

https://INSTANCE_ID-dot-VERSION_ID-dot-SERVICE_ID-dot-MY_PROJECT_ID.appspot.com
http://INSTANCE_ID.VERSION_ID.SERVICE_ID.MY_CUSTOM_DOMAIN
注意:配置为自动缩放或基本缩放的服务不支持以实例为目标。实例ID必须为 范围从0到实例总数的整数 跑步无论您的缩放类型或实例类是什么,它都不是 可以向特定实例发送请求而不以 该实例中的服务或版本

要确定可以使用的实例ID,例如:

// Get the instance handling the current request.
int currentInstance = modulesApi.getCurrentInstance();
请注意,如果目标实例发生故障,您将永久性地获得错误(该实例将不会返回),因此您可能需要考虑一种回退解决方案,以便以某种方式转到一个非基于实例的页面,在该页面上您可以在另一个实例上挂起流程

但这种解决方案在GAE flex环境中不可用。发件人:

注意:在灵活的环境中,不支持以实例为目标。无法将请求直接发送到特定的服务器 例如


我同意戴夫的回答,GAE并不完全符合你的愿望

然而,可以有办法解决这个问题,但只有在少数特定情况下:如果您使用标准GAE环境并手动扩展,并且后续请求总是基于嵌入在对前一个请求的响应中的URL

您可以根据目标路由规则在响应请求时手工创建URL,以便后续请求命中同一实例。发件人:

  • 如果您仍在使用或拥有,则可以通过 包括实例ID。实例ID是范围内的整数 从0到正在运行的实例总数,并且可以 具体规定如下:
向特定实例中的特定服务和版本发送请求:

https://INSTANCE_ID-dot-VERSION_ID-dot-SERVICE_ID-dot-MY_PROJECT_ID.appspot.com
http://INSTANCE_ID.VERSION_ID.SERVICE_ID.MY_CUSTOM_DOMAIN
注意:配置为自动缩放或基本缩放的服务不支持以实例为目标。实例ID必须为 范围从0到实例总数的整数 跑步无论您的缩放类型或实例类是什么,它都不是 可以向特定实例发送请求而不以 该实例中的服务或版本

要确定可以使用的实例ID,例如:

// Get the instance handling the current request.
int currentInstance = modulesApi.getCurrentInstance();
请注意,如果目标实例发生故障,您将永久性地获得错误(该实例将不会返回),因此您可能需要考虑一种回退解决方案,以便以某种方式转到一个非基于实例的页面,在该页面上您可以在另一个实例上挂起流程

但这样的解决方案并非如此