読者です 読者をやめる 読者になる 読者になる

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

セッションレプリケーションのAPサーバ動作比較(「Tomcat 7」vs「JBoss AS 7」vs「Jetty 8」で勝負)

Java


阪本です。

突然ですが、みなさんはWebアプリを動作させるときに、どのAPサーバを使っていますか?
私は専らTomcatとJBossです。
エンタープライズ向けだと、周りではJBossが多いですね。

JBossは他のAPサーバと比べて何が違うのか?
私は、耐障害性を高めるクラスタリングを行うにあたり、セッションレプリケーションの違いに着目しています。エンタープライズで必ずといっていいほど気にされる、セッションレプリケーションについて、標準機能における各APサーバの動作指定が可能な設定をまとめてみました。

JBoss AS 7 Tomcat 7 Jetty 8
セッション永続化によるレプリケーション JDBC (ファイル/JDBC JDBC
オンメモリレプリケーション (JGroups/Infinispan) (TCP) Terracotta
同期/非同期の指定 ×
同期モードの指定 All to All*1/Buddy*2 All to All/Buddy ×
同期タイミングの指定 set*3/set&get*4/set&non primitive get*5/access*6 set&get 定期レプリケーション
同期範囲の指定 attribute/session/field × ×

見てのとおり、TomcatとJBossでできることは似ています。ただ、やはり以下の点で、JBossの方が有利であることには間違いありません。

JGroupsでは、TCP以外のプロトコルも用いて通信を行うため、より信頼性の高いレプリケーションクラスタリング)を行うことができます。同期タイミングの「set&non primitive get」では、Immutableなオブジェクトをセッションから読み取る場合はレプリケーションを行わないため、無駄なレプリケーションを行わずに高速で処理することができます。

前回のプロジェクトでは、セッションレプリケーションの動作が重要だったため、JBossを選択しました。
APサーバの選択の参考になれば幸いです。

それでは。

*1:クラスタ内の全ノードが同じセッション情報を持つ。ノードが増えるにしたがってレプリケーションのオーバーヘッドが大きくなる。

*2:クラスタ内のある2つのノードでレプリケーションを行う。オーバーヘッドは少ないが、多重障害に弱い。

*3:setAttribute呼び出し時のみレプリケーションする。getAttributeで取得したオブジェクトに対して変更を加えた場合、必ずsetAttributeを呼び出す必要がある。

*4:setAttribute/getAttribute呼び出し時にレプリケーションする。

*5:set&getとほぼ同じだが、プリミティブ型のラッパー型の場合はgetAttributeでレプリケーションしない。

*6:セッションへのアクセス時にレプリケーションを行う。もっとも負荷が高い。