10

Google App Engine(または任意の分散サーバー環境)でシングルトンがどのように機能するかについて興味があります。アプリケーションが一度に複数のプロセス(複数のマシン上)で実行され、リクエストがすべての場所からルーティングされる可能性がある場合、アプリが次のようなことを行うと、実際には内部で何が起こりますか?'CacheManager.getInstance()'?

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

よろしく、シェーン

4

3 に答える 3

13

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

于 2009-07-26T15:19:35.140 に答える
3

キャッシュは通常、ある種の分散複製キャッシュとリンクされています。たとえば、GAE はmemcachedのカスタム バージョンを使用して、クラスター全体でオブジェクトの共有キャッシュを維持しながら、ストレージの状態を一貫した状態に維持します。一般に、この問題には多くの解決策があり、パフォーマンスとキャッシュの一貫性に関してさまざまなトレードオフが必要です (たとえば、すべてのキャッシュが常に 100% 一致することが重要であるか、保護するためにキャッシュをディスクに書き込む必要があるかなど)。紛失防止など)。

以下に、分散キャッシュ機能を備えたサンプル製品をいくつか示します (ほとんどの製品には、さまざまなアプローチのトレードオフを詳細に説明したドキュメントがあります。

  • memcached - 多くのクライアント API と言語ポートを備えた C
  • Ehcache - 広く採用されている OSS Java キャッシュ
  • JBoss Cache - もう 1 つの一般的な Java OSS ソリューション
  • Oracle Coherence (以前の Tangosol Coherence) - おそらく最も有名な Java 商用キャッシュです。
  • Indexus Cache - 人気のある .Net OSS ソリューション
  • NCache - おそらく最も人気のある .Net 商用キャッシュ ソリューション

ご覧のとおり、この問題に取り組んできたプロジェクトは数多くあります。考えられる解決策の 1 つは、1 台のマシンで 1 つのキャッシュを単純に共有することですが、ほとんどのプロジェクトでは、何らかのレプリケーションと分散フェイルオーバーが可能です。

于 2009-07-26T02:56:53.740 に答える
0

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

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

GAEのドキュメントは、基本的に同じことを可能にする「App Caching」と呼ばれるものをサポートしているようですが、マルチスレッドのWebサーバーを使用してこれを行っているのか、それともいくつかのWeb サーバーと並行して実行されている他のキャッシュ プロセス。

CacheManager.getInstance() 常に同じオブジェクトに解決されるのか、それとも同じ Web サーバーによって処理されるリクエストに対してのみ同じオブジェクトであるかを知りたいと思います。実際には、別の memcached プロセスと対話するためにのみ使用されるため、問題にはなりません。

于 2009-07-26T08:05:11.423 に答える