如何在App Engine上实现服务器关联或粘性会话?

时间:2012-05-17 16:58:51

标签: google-app-engine session-state sticky

我的申请希望:

  1. 自动扩展性

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

    • 在初始客户端 - >服务器HTTP请求之后,我想要客户端 能够连接到同一个appserver,以便appserver 可以保持一堆客户端状态
    • 州可能会经常更新(为了支持实时互动), 因此,不希望基于memcache +基于数据存储的持久性。
    • 服务器可能需要根据多个客户端的状态做出决策, 例如实时多人游戏
  3. 我该如何做到这一点?

3 个答案:

答案 0 :(得分:5)

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

Python实现

  1. 将后端配置为 public dynamic

    # 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. 客户端与特定实例建立后续连接 后端网址:

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

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

    https://3-dot-foo.your_app_id.appspot.com
    
  6. 限制

    1. 后端不会永远存在,可能会意外关闭,恕不另行通知
    2. 您的应用程序可以拥有的后端数目目前是有限的

答案 1 :(得分:4)

补充Adam的好答案:在GAE中不需要服务器关联,因为存储在HTTP会话中的数据不是保存在内存中,而是保存在持久数据存储中。因此,任何服务器都将找到先前存储在会话中的任何其他服务器。见the documentation

  

App Engine包含使用servlet的会话实现   会话界面。该实现将会话数据存储在App中   用于持久性的引擎数据存储,还使用memcache来提高速度。如   与大多数其他servlet容器一样,会话属性是   在请求期间使用session.setAttribute()设置将保留在   请求结束。

     

默认情况下,此功能处于关闭状态。要打开它,请添加以下内容   应用服务引擎-web.xml中:

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

该实现创建了_ah_SESSION类型的数据存储区实体,   和memcache条目使用前缀为_ahs的键。

     

注意:因为App Engine将会话数据存储在数据存储区中   memcache,会话中存储的所有值都必须实现   java.io.Serializable界面。

     

通过配置您的服务可以减少请求延迟   应用程序以异步方式将HTTP会话数据写入   数据存储区:

答案 2 :(得分:0)

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

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