スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

GAEのサーバー構成とリクエストの流れ


Google App Engine Stackの構成(引用元)>

GAE Stackの特徴

    • 現在の利用状況
      • 8万以上のアプリを収容
      • 140M PV/day
      • 20万人以上の開発者が利用
  • 統合環境を提供
    • サーバーの構築や管理が不要。デプロイが容易
    • ログ管理、管理コンソールや各種ツールを提供
  • スケーラブルなWebアプリ構築のためのベストプラクティス利用を促す環境
      • 個々のリクエストの処理時間やリソース消費を制限
      • ステートレス設計と内蔵APIの利用
      • Datastoreによるパーティション化されたデータモデルの利用
  • 非常に高いスケーラビリティと可用性を備えるGoogleクラスタ環境を簡単に利用できる
    • 自動クラスタリングによる負荷分散と高可用性を提供
    • アプリの負荷状況に応じてApp Serverを動的に増減
    • アプリ間の隔離性を維持、個々のアプリの安全性とパフォーマンスを確保
  • 既存のGoogleテクノロジーがベース

GAE Stackの構成要素

  • App Master
    • アプリのデプロイ管理やバージョン管理
    • Front EndへのApp Server位置の通知
    • 全体の統括
  • Front End
    • HTTPのリクエスト受信とレスポンス送信を担当
    • リクエストはクライアントから最も近いGoogleデータセンターに到着
    • Google内部ネットワークを経由してFront Endに到着
    • リクエストは最大10MBまで
    • スタティックコンテンツはスタティックファイルサーバーに、ダイナミックコンテンツはApp Serverに転送
  • スタティックファイルサーバー
    • スタティックコンテンツを提供するサーバー
    • スタティックコンテンツとは
      • appengine-web.xmlでstatic要素に指定した、静的コンテンツ
      • HTMLファイルや画像ファイル、動画ファイルなど
    • アプリコードとは別の専用サーバーに配置される
    • Front Endが直接処理し、App Serverは関与しない
  • App Server
    • ダイナミックコンテンツのリクエストを処理。アプリコードが動作するアプリサーバー
    • 多数のアプリを同時に収容し、アプリ間の隔離性を確保する
  • APIのサーバー
    • Datastore、Memcacheなど、各種APIに基づくサービスを提供


<GAEが提供するAPI引用元)>

App Serverについて

  • App Serverの構成
  • App Serverによるアプリの扱い
    • アプリはステートレスに設計する
      • アプリにステート(フィールド内容など)は持たせない
        • アプリが異なるApp Serverに移動する場合でも、ステートは引き継がれない
        • 多数のApp Serverによる負荷分散とフェイルオーバーを簡素化するため
        • ステートはDatastoreやmemcacheに保存する
      • セッション情報はDatastoreに保存されるので、どのApp Serverからでも同じ内容を共有できる
        • (セッションの掃除が必要?)
  • アプリのデプロイ後の起動
    • 初回アクセス時はランタイムのメモリ上にアプリのキャッシュがないため初期化が実行され、処理が遅い
    • 次回以降アクセス時はメモリ上のアプリによりすぐにリクエストを処理
  • App Engine APIクラスライブラリ
    • App Server上ではパッチリリースのアップグレードが自動的に行われ、再デプロイの必要はない
  • ApiProxyによるAPIコールの扱い
    • APIコールはApiProxyを経由して実行される
    • 個々のリクエストの情報(ThreadLocal)を保存する
    • APIコールをAOPのようにインターセプトして、その前後に追加処理を挿入できる
      • ログ記録など
    • クラスパス変更(JAR入れ替え?)だけで、APIのサービスプロバイダーを変更できる
  • App Serverのサンドボックス
    • きめ細かなサンドボックス制御で、安全性を確保しつつ、できるだけ多くの既存コードを動かせる環境を提供する
    • GAEで使える既存ライブラリ
Dependency Injection Frameworks
  - Guice, Spring, etc.
Aspect Oriented Programming
  - AspectJ, Spring AOP, etc.
Web frameworks
  - Google Web Toolkit, Tapestry, BlazeDS (Flex), etc.
  - Grails (Just Announced!)
Alternate JVM languages
  - Scala, Rhino, JRuby, Jython, Clojure, Groovy, PHP, etc.

<GAE/Jで利用可能な既存資産:引用元

GAEのスケールアウト

GAEのスケールアウト事例


<"Open For Questions"のトラフィック推移(引用元)>

そのほか

  • Java版とPython版の性能の違いは?
    • きちんとした比較はしていない。使い方によって異なるが、あまり大きな違いはない。GAE以外の環境で両者を比べた場合と同じ程度。
  • Cometサポートは?
    • 現状ではレスポンスのストリーム送信に対応しないため、Cometは使えない。現状、Cometサポートはロードマップにはないが、XMPPはサポート予定なので、プッシュ通信は実装できるようになる
  • googleスタッフがデータを閲覧しないためのセキュリティポリシーはあるか?
    • 社内のポリシーがある