ロードバランスされたTomcat Webサーバーがあります。すべてのリクエストは別のTomcatサーバーによって提供される可能性があります。ロードバランスWebアプリケーション
j2ee(struts)ベースのWebアプリケーション用のコードを記述する際に、どうすればこのことができますか?
ロードバランスされたTomcat Webサーバーがあります。すべてのリクエストは別のTomcatサーバーによって提供される可能性があります。ロードバランスWebアプリケーション
j2ee(struts)ベースのWebアプリケーション用のコードを記述する際に、どうすればこのことができますか?
まず、セッションアフィニティ/スティッキセッション用のロードバランサを設定して、JSESSIONIDに基づいて(同じであれば)同じTomcatにすべてのリクエストを転送し続けるようにします。あなたのすべてのセッション属性がjava.io.Serializable
<distributable/>
要素を持っているか、あなたの<Context distributable="true" />
に設定を確認してください実装する必要があります
Serializable
を実装していないSessionにオブジェクトを入れることを開始した場合プロパティ/フィールドにSerializable
が実装されていない場合)、問題が発生します。あなたが均衡しているとき、スティッキーセッションを使用する理由についてコメントでの質問のいくつかに対処するには:
(実際にはこれらの点すべてにかかわらず、使用しているサーブレットコンテナの適用、私は信じています。)
更新複数のサーバー間で負荷をかけている場合は、例を挙げてこれを説明するのが最も簡単だと思います。
まず、アプリケーションが何らかの種類のデータをセッション中に保持している場合、これは本当に重要です。これは、すべての単一アプリケーションではない可能性があります。あなたがセッション中のデータを保持しない場合、おそらくこれについて気にすることはなく、ここで読むことを止めることができます。
セッション中にデータを保持するが、ではなく、のセッションがあると、頭痛の世界が広がります。 が特定のセッション属性の一部の値を更新し、second.jsp
がこの同じセッション属性を読み取るとします。セッションデータをクラスタ内のすべてのサーバに複製するようにTomcatを設定することはできますが、この複製は即座には行われません。 first.jsp
の最初のリクエストがで処理され、完了後1ナノ秒が経過した場合、同じ訪問者がsecond.jsp
にリクエストします。これは、スティッキなしの環境ではserver2
が処理されます。レプリケーションは瞬間的なものではないので、最新のセッションデータを読み込んでいるかどうかを知る方法はありますか?クラスタ間で読み込みを同期させるために何らかのロジックを追加する必要がありますか?これは巨大な痛みになります。
セッションアフィニティ/スティッキセッションを設定すると、この頭痛がなくなります。同じクライアント・サーバーからのすべての要求を同じノードで処理することにより、「このノードは要求を処理するまでに最新の状態になっていますか?」という心配はありません。ノードに障害が発生すると、クライアントはセッションデータのコピーを持つクラスタ内の別のノードにフェールオーバーすることができますが、スティッキーセッションではまれなケースになります。
スティッキセッションを必要とする別の理由があります。クラスタ内のノード間のロードです。セッション内のリクエストがどのノードでも処理できる場合は、クラスタにall-to-allレプリケーションが設定されていることを意味します(つまり、node1のセッションデータがnode2、node3、...、nodeにレプリケートされます)。 N、node2のセッションデータはnode1、node3、... none Nなどに複製されます)。クラスタへの各追加は、クラスタ内の他のすべての単一ノードと通信する必要がある別のノードを意味するため、クラスタが大規模になると、オール・ツオール・セッション・レプリケーションは帯域幅とリソースを集中させる可能性があります。
これは、ノードのデータがクラスタ内の少数の「バディ」に複製されているため、ノードに障害が発生した場合でも、データは1つのノードごとにコピーされる必要はありません。このシナリオでは、ノード1にノード2とノード3に複製されたデータがノード1に、ノード3とノード4にデータが複製されてチェーンが形成されるようにクラスタを構成します。このシナリオでは、クラスタにノードを追加しても、ノード間の通信量は、オールツーオール方式と同様に急激に増加することはありません。
最初のステートメントでは、最初のリクエストを処理するTomcatが選択されたときに、そのブラウザからの次のリクエストを処理するために同じTomcatを使用する必要があることを意味しますか?この場合、同じTomcatサーバーがすべての要求を処理する場合、負荷分散はどのように役立ちますか? – user32262
私はロードバランシングの主な考え方は、複数のサーバーを使用して複数のクライアントにサービスを提供していると思います。同じクライアントからの要求がすべて複数のサーバーに配信されることを意味するものではありません。ちょっと考えました。 –
この場合、Strutsの違いはありません。提供されたアドバイスに固執する、マット。 +1 –