2009-07-26 8 views
10

私は、どのようにシングルトンがGoogle App Engine(または任意の分散サーバ環境)で動作するかに関して興味を持っています。あなたのアプリケーションは、複数のプロセス(複数のマシン上)で同時に実行でき、要求はすべて場所から離れてルーティングされます。実際には、アプリケーションが「CacheManager.getInstance()」のような動作をすると実際に何が起こりますか?Google App Engine(より一般的には分散サーバ環境)のシングルトンはどのように機能しますか?

私はちょうど例として(GAE)CacheManagerを使用していますが、私の要点はどこかでシングルトンの単一のグローバルアプリケーションインスタンスが存在するからです。 RPCが呼び出されていますか?実際、グローバルなアプリケーションの状態(セッションなど)はどのように実際には一般的にどのように処理されますか?

よろしく、 シェーン

答えて

12

App Engine Javaのシングルトンは、Webアプリケーションごとではなく、ランタイムごとです。その目的は、基本的なサービス(MemcacheとUsers APIの両方の場合、RPC経由でアクセスされる)への単一のアクセスポイントを提供することだけです。これは純粋にライブラリのデザインパターンです。アプリケーションごとのシングルトンはありませんこれらのメソッドがアクセスする場所

+0

これは私がそれがうまくいくと予測した方法ですが、それをクリアしてもいいです。乾杯。 :) – Shane

3

キャッシュは、一般的に、分散、複製キャッシュのいくつかの並べ替えでリンクアップしています。たとえば、GAEではカスタムバージョンのmemcachedを使用して、ストレージ状態を一貫した状態に維持しながら、クラスタ全体のオブジェクトの共有キャッシュの管理を処理します。一般に、この問題の解決策はたくさんあります。パフォーマンスとキャッシュの一貫性の観点から、さまざまなトレードオフがあります(たとえば、すべてのキャッシュが100%一致することが重要です。キャッシュをディスクに書き込んで保護する必要があります損失などに対して)。 - クライアントAPIの多くと言語ポート

  • EhcacheとC - OSS

    • memcached:ここ

      はほとんどが非常に詳細に様々なアプローチのトレードオフを記述した文書を持っている(分散キャッシュ機能を持ついくつかのサンプル製品です広く採用とJavaキャッシュ、

    • JBoss Cache - もう一つの人気のJava OSSソリューション
    • Oracle Coherence (formerly Tangosol Coherence) - おそらく最もよく知られたJavaの商用キャッシュ。
    • Indexus Cache - 人気のネットOSSソリューション
    • NCache - 多分最も人気のあるネットの商用キャッシュソリューション

    あなたが見ることができるように、この問題にアプローチしてきた多くのプロジェクトがありました。 1つの可能な解決策は、単一のマシン上で単一のキャッシュを単純に共有することですが、ほとんどのプロジェクトではある種のレプリケーションと分散フェイルオーバーが可能です。

  • +0

    キャッシュの例をありがとうございますが、私はキャッシュを、Web開発のシングルトンの使用例として使用していました。私は簡単にUsersシングルトンになりました。 私が上記の答えで言うように、私は、リクエスト/レスポンスフェーズ後に永続化するシングルトンオブジェクトのアイデアを混乱させます。リクエストを生き延びることはできないと私は理解しているので、シングルトンが実際に何を意味しているのか、分散したウェブ環境で正確に何をするのかを理解しようとしています。 しばらくして、私が与えたキャッシュサンプルのコードを調べて、そのコードが何をしているかを見てみましょう。 – Shane

    +0

    私はキャッシングの例を挙げました。なぜなら、この質問に対する答えは一つもないからです。シングルトンをVMごと(または要求ごとに)にする場合は、シングルトンをまったく配布しないでください。一方、複数のVMと要求にシングルトンを共有する場合は、いくつかの種類のキャッシュソリューションを使用することになります。セッション処理の場合も同様です。私はあなたが参照している "シングルトン"は、共有リソースのためにクライアントにアクセスするために使用されるVM(たぶん1つのリクエストにさえ)シングルトンだけであると考えています。 – jsight

    0

    GAEの詳細についてはわかりませんが、通常はこのサイズのWebアプリケーションでは、複数のプロセスを複数のマシンで実行し、それらの間で負荷を分散します。各プロセス内で、マルチスレッドWebサーバーを使用している場合、複数の要求を処理できます。これにより、同じWebサーバー内の要求(および、たとえばWebアプリケーションプロセスの開始時にインスタンス化するシングルトン)間でオブジェクトを共有できます。

    ウェブサーバがマルチスレッドではなくマルチプロセスである場合は、別のキャッシュプロセスと話をすることなく、私が知る限り要求間でオブジェクトを共有することはできません。

    GAEのドキュメントは、基本的に同じことを可能にする「App Caching」をサポートしているようですが、マルチスレッドのWebを使ってこれを行うかどうかは私には分かりませんでしたサーバー、またはWebサーバーと並行して実行されているその他のキャッシング・プロセスが含まれます。

    私はCacheManager.getInstance()常にかどうかを知るために興味をそそられるだろうが、同じオブジェクトに解決、またはそれは、同じWebサーバーによって処理される要求のための唯一の同じオブジェクトの場合。現実には、とにかく別のmemcachedプロセスとの会話にしか使われていないので、問題ではありません。

    +0

    シングルトンの本質は、同じオブジェクトインスタンスに解決されなければならないことを意味すると私は考えていました。私がリクエストを思うと、文字通り、特にGoogle App Engineとのプロセス親和性を期待しません。一つの要求がオーストラリアに行き、次は米国に行くことを期待しています。そのために、私が信頼できるケースについて考えることができる唯一の方法は、何らかの種類の中央コントローラへのRPCです。それはちょうど私にとって反規模に見えるので、私の関心です。 Memcacheの例は、複数のデータセンターに分散しているクラウド環境では難しいケースです。 – Shane

    関連する問題