負荷分散された tomcat Web サーバーがあります。すべてのリクエストは、異なる tomcat サーバーによって処理される可能性があります。
j2ee (struts) ベースの Web アプリケーションのコードを作成する際に、どのように対処すればよいでしょうか?
負荷分散された tomcat Web サーバーがあります。すべてのリクエストは、異なる tomcat サーバーによって処理される可能性があります。
j2ee (struts) ベースの Web アプリケーションのコードを作成する際に、どのように対処すればよいでしょうか?
まず、ロード バランサーをセッション アフィニティ/スティッキー セッション用にセットアップして、JSESSIONID に基づいてすべてのリクエストを同じ Tomcat に転送し続けるようにします (Tomcat が稼働している限り)。
Tomcat クラスタリングのドキュメントには、アプリケーションがセッションを正常にレプリケートするための 2 つの重要な要件が記載されています。
java.io.Serializable
<distributable/>
要素または設定があることを確認してください<Context distributable="true" />
Serializable
実装していない(または実装していないプロパティ/フィールドを持つ)オブジェクトをセッションに入れ始めるとSerializable
、問題が発生します。
(実際、これらのポイントはすべて、使用しているサーブレット コンテナーに関係なく適用されると思います。)
更新:複数のサーバー間で負荷を分散しているときにスティッキー セッションを使用する理由に関するコメントのいくつかの質問に対処するには、例を使用してこれを説明するのが最も簡単だと思います。
まず第一に、これはアプリケーションがある種のデータをセッション内に保持している場合にのみ重要です。データをセッション内に保持しない場合は、おそらくこれについて気にしないので、ここで読むのをやめてください。
データをセッション内に保持し、スティッキー セッションを持たない環境を使用すると、頭痛の世界が開かれます。
first.jsp
特定のセッション属性の値を更新し、second.jsp
たまたま同じセッション属性を読み取ったとします。クラスター内のすべてのサーバーにセッション データをレプリケートするように Tomcat をセットアップできますが、このレプリケーションはすぐには行われません。の最初のリクエストfirst.jsp
が によって処理されserver1
、完了してから 1 ナノ秒後に同じ訪問者が にリクエストを送信するとsecond.jsp
、スティッキーでない環境では によって処理されserver2
ます。レプリケーションは瞬時に行われるわけではないため、最新のセッション データを読み取っているかどうかを知る方法はありますか? クラスター全体で読み取りを同期するために、何らかのロジックを追加する必要がありますか? これは巨大な痛みになります。
セッション アフィニティ/スティッキー セッションを設定すると、この問題が解消されます。同じクライアント サーバーからのすべてのリクエストを同じノードで処理することにより、「このノードがリクエストを処理するまでに最新の状態になっているかどうか」について心配する必要はありません。ノードに障害が発生した場合でも、クライアントはクラスター内の別のノードにフェイルオーバーできます。このノードには、そのセッション データのコピーがありますが、スティッキー セッションでは、これはまれなケースであり、標準ではありません。
スティッキー セッションが必要な別の理由があります。クラスタ内のノード間の負荷です。セッション内のリクエストが任意のノードで処理できる場合、それはクラスター内で全対全レプリケーションがセットアップされていることを意味します (つまり、ノード 1 のセッション データはノード 2、ノード 3、...、ノードに複製されます)。 N、node2 のセッション データは node1、node3、... none N などにレプリケートされます)。クラスターが大きくなると、すべてのセッション レプリケーションが帯域幅とリソースを大量に消費する可能性があります。これは、クラスターに追加するたびに、クラスター内の他のすべての単一ノードと通信する必要があるノードがさらに 1 つ増えることを意味するためです。
これに代わる方法は、ノードのデータをクラスター内の少数の「バディ」のみにレプリケートすることです。これにより、ノードに障害が発生した場合、そのデータは他の場所で使用できますが、すべてのノードがコピーを持つ必要はありません。このシナリオでは、ノード 1 のデータがノード 2 と 3 にレプリケートされ、ノード 2 のデータがノード 3 と 4 にレプリケートされるようにクラスターを構成し、チェーンを形成します。このシナリオでは、クラスターにノードを追加しても、全対全スキームのようにノード間の通信量が急速に増加することはありません。