9

我的应用程序希望:

  1. 自动可扩展性

    • 我希望 App Engine 在流量增加时启动我的应用的新实例
    • 当实例空闲时,我希望 App Engine 将它们关闭
  2. 客户端/服务器亲和性

    • 在一个初始的client->server HTTP请求之后,我希望clients能够连接到同一个appserver,这样appserver就可以维护一堆client状态
    • 状态可能会频繁更新(为了支持实时交互),因此基于 memcache+datastore 的持久性是不可取的。
    • 服务器可能需要根据多个客户端的状态做出决策,例如实时多人游戏

我怎样才能做到这一点?

4

3 回答 3

5

您可以使用 App Engine 后端(长期运行、可配置、可寻址、持久的服务器)实现这些目标:

Python 实现

  1. 将后端配置为公共动态的

    # backends.yaml
    
    backends:
    - name: foo
      instances: 20
      options: public, dynamic
    
  2. 除了以通常的方式部署您的应用程序之外:

    appcfg.py update .
    

    记得部署你的后端:

    appcfg.py backends . update
    
  3. 对于初始连接,让您的客户端使用非实例特定的后端主机名,例如:

    foo.your_app_id.appspot.com
    

    App Engine 将在可选地启动新的后端实例后将您的请求路由到可用的后端实例。

  4. 在服务器上的请求处理代码中,使用后端 API 来确定哪个实例正在处理请求,并向客户端返回一个实例特定的 URL。

    from google.appengine.api import backends
    
    import webapp2
    
    class GetPersistentUrlHandler(webapp2.RequestHandler):
    
      def get(self):
        """Return the current backend's instance-specific URL."""
    
        my_url = backends.get_url(instance=backends.get_instance())
        self.response.write(my_url)
    
    app = webapp2.WSGIApplication([
      ('/get_peristent_url', GetPersistentUrlHandler),
    ], debug=True)
    
  5. 客户端与实例特定的后端 URL 建立后续连接:

    http://3.foo.your_app_id.appspot.com
    

    注意:使用 https 时,请务必将子域点替换-dot- 为以避免 SSL 证书问题。

    https://3-dot-foo.your_app_id.appspot.com
    

限制

  1. 后端不会永远存在,可能会意外关闭,恕不另行通知
  2. 您的应用程序可以拥有的后端数量目前是有限的
于 2012-05-17T17:47:13.063 回答
4

为了补充 Adam 的好答案:您不需要 GAE 中的服务器亲和性,因为存储在 HTTP 会话中的数据不是保存在内存中,而是保存在持久数据存储中。因此,任何服务器都会找到之前存储在会话中的任何其他服务器。请参阅文档

App Engine 包括使用 servlet 会话接口的会话实现。该实现将会话数据存储在 App Engine 数据存储中以实现持久性,并且还使用 memcache 来提高速度。与大多数其他 servlet 容器一样,session.setAttribute()在请求期间设置的会话属性在请求结束时保留。

此功能默认关闭。要打开它,请将以下内容添加到 appengine-web.xml:

<sessions-enabled>true</sessions-enabled>

_ah_SESSION该实现使用前缀为 的键创建类型的数据存储实体和内存缓存条目_ahs

注意:因为 App Engine 将会话数据存储在数据存储区和内存缓存中,所以存储在会话中的所有值都必须实现该 java.io.Serializable接口。

通过将应用程序配置为将 HTTP 会话数据异步写入数据存储区,可以减少请求延迟:

于 2012-05-17T17:16:50.820 回答
0

自动可扩展性是 AppEngine 最擅长的,也是它与其他云托管提供商的最大区别。无需您做任何额外工作即可满足您的两个要求。

AppEngine 没有单独服务器的概念。在创建一个好的、可扩展的 AppEngine 应用程序时,您不能以这样的方式思考。但是,您可以在 Memcache 或 Datastore 中的请求之间存储客户端状态,这些请求在应用程序代码的所有实例之间共享。

于 2012-05-17T17:11:46.703 回答