9

私のアプリケーションは次のことを望んでいます:

  1. 自動スケーラビリティ

    • トラフィックが増加したときに、App Engine でアプリの新しいインスタンスをスピンアップしたい
    • インスタンスがアイドル状態になったら、App Engine にシャットダウンさせたい
  2. クライアント/サーバー アフィニティ

    • 最初の client->server HTTP リクエストの後、クライアントが同じ appserver に接続できるようにして、appserver が一連のクライアント状態を維持できるようにします
    • 状態は (リアルタイムの対話をサポートするために) 頻繁に更新される可能性があるため、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 には、サーブレット セッション インターフェースを使用したセッションの実装が含まれています。この実装では、永続性のためにセッション データを App Engine データストアに保存し、高速化のために memcache も使用します。他のほとんどのサーブレット コンテナと同様session.setAttribute()に、リクエスト中に設定されたセッション属性は、リクエストの最後に保持されます。

この機能はデフォルトでオフになっています。オンにするには、appengine-web.xml に次を追加します。

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

この実装では、種類のデータストア エンティティ_ah_SESSIONと、接頭辞が_ahs.

注: App Engine はセッション データをデータストアと memcache に保存するため、セッションに保存されるすべての値は java.io.Serializableインターフェースを実装する必要があります。

HTTP セッション データをデータストアに非同期で書き込むようにアプリケーションを構成することで、リクエストのレイテンシを短縮できます。

于 2012-05-17T17:16:50.820 に答える
0

自動スケーラビリティは、AppEngine が最も得意とすることであり、他のクラウド ホスティング プロバイダーとの最大の違いです。追加の作業を行うことなく、両方の要件が満たされます。

AppEngine には、個々のサーバーという概念がありません。優れたスケーラブルな AppEngine アプリを作成する際に、そのような用語で考えることはできません。ただし、アプリケーション コードのすべてのインスタンス間で共有される Memcache またはデータストア内のリクエスト間のクライアント状態を保存することはできます。

于 2012-05-17T17:11:46.703 に答える