4

Glassfishアプリサーバークラスターで実行されているJavaEEベースのWebアプリケーションがあります。着信トラフィックは主に、アプリケーションリソースのXMLベースの表現に対するRESTfulリクエストですが、おそらくトラフィックの5%がJSONベースまたはXHTML/CSSベースの表現に対するものである可能性があります。

現在、クラスタ内のGlassfishインスタンス全体に着信トラフィックを分散するための負荷分散ソリューションを調査しています。また、メモリ内の分散ハッシュマップであるmemcachedを使用してクラスターをオフロードする方法も検討しています。このハッシュマップのキーは、RESTリソース名(「/ user / bob」、「/ group / jazzlovers」など)であり、値は次のとおりです。対応するXML表現。

有望に聞こえる1つのアプローチは、1つの石で両方の鳥を殺し、軽量で高速なnginxHTTPサーバー/リバースプロキシを使用することです。Nginxは、最初にmemcachedでURIを検索して、有効期限が切れていないXML表現がすでに存在するかどうかを確認することで、各着信リクエストを処理します。そうでない場合、nginxはGlassfishインスタンスの1つにリクエストを送信します。nginx memcachedモジュールについては、この短い記事で説明しています。

このように使用されたnginxとmemcachedの全体的な印象はどうですか?それらにどの程度満足していますか?それらについて学ぶのに最も役立つリソースは何ですか?あなたがそれらを試したが、それらがあなたの目的に合わなかった場合、なぜそうではなく、代わりに何を使用しましたか?

注:これは関連する質問です。

更新:後でServerFault.comで同じ質問をしました。そこにある答えは、主にnginxの代替案を示唆しています(役に立ちますが、間接的に)。

4

1 に答える 1

9

アプリケーションサーバーのバンクがユーザーへのアップストリーム配信データを持っていると仮定します。

upstream webservices {
    server 10.0.0.1:80;
    server 10.0.0.2:80;
    server 10.0.0.3:80;
}
server {
    ... default nginx stuff ...
    location /dynamic_content {
          memcached_pass localhost:11211;
          default_type   text/html;
          error_page     404 502 = @dynamic_content_cache_miss;
          set $memcached_key $uri;
    }
    location @dynamic_content_cache_miss {
          proxy_pass http://webservices;
    }

上記のnginx.confスニペットが行うことは、すべてのトラフィックをhttp://example.com/dynamic/から*直接memcachedサーバーに転送することです。memcacheにコンテンツがある場合、アップストリームサーバーにはトラフィックが表示されません。

キャッシュヒットが404または502エラーで失敗した場合(キャッシュ内にないか、memcacheに到達できない場合)、nginxはリクエストをアップストリームサーバーに渡します。アップストリーム定義には3つのサーバーがあるため、透過的な負荷分散プロキシも取得します。

ここでの唯一の注意点は、バックエンドアプリケーションサーバーがmemcache内のデータを最新の状態に保つことを確認する必要があるということです。私はnginx+memcached + web.pyを使用して、比較的控えめなハードウェアで1分あたり数千のリクエストを処理するシンプルな小さなシステムを作成しています。

アプリケーションサーバーの一般的な擬似コードは、web.pyの場合は次のようになります。

class some_page:
     def GET(self):
         output = 'Do normal page generation stuff'
         web_url = web.url().encode('ASCII')
         cache.set(web_url, str(output), seconds_to_cache_content)
         return output

上記のweb.py/擬似コードで覚えておくべき重要なことは、nginxを介してmemcachedから取得されたコンテンツはまったく変更できないということです。nginxは、Unicodeではなく単純な文字列を使用しています。Unicode出力をmemcachedに保存すると、キャッシュされたコンテンツの最初と最後に少なくとも奇妙な文字が表示されます。

私はスポーツ関連のウェブサイトにnginxとmemcachedを使用しています。このウェブサイトでは、数時間しか続かない大量のトラフィックが発生します。nginxとmemcachedなしではうまくいきませんでした。上記の変更を実装した後、7月4日の最後の大きなスポーツイベント中のサーバー負荷は70%から0.6%に低下しました。私はそれを十分に推薦することはできません。

于 2009-07-07T15:34:36.280 に答える