突然ですが、みなさんは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の方が有利であることには間違いありません。
- オンメモリレプリケーションでは、単なるTCP/IPのマルチキャストを用いるのではなく、JGroupsを使用するため、信頼性の高い通信を行える
http://www.jgroups.org/ - セッションの同期タイミングは、Tomcatで使用されている「set&get」よりも高速動作する「set&non primitive get」が提供されている
http://docs.jboss.org/jbossas/docs/Clustering_Guide/beta422/html/clustering-http-app.html
JGroupsでは、TCP以外のプロトコルも用いて通信を行うため、より信頼性の高いレプリケーション(クラスタリング)を行うことができます。同期タイミングの「set&non primitive get」では、Immutableなオブジェクトをセッションから読み取る場合はレプリケーションを行わないため、無駄なレプリケーションを行わずに高速で処理することができます。
前回のプロジェクトでは、セッションレプリケーションの動作が重要だったため、JBossを選択しました。
APサーバの選択の参考になれば幸いです。
それでは。
*1:クラスタ内の全ノードが同じセッション情報を持つ。ノードが増えるにしたがってレプリケーションのオーバーヘッドが大きくなる。
*2:クラスタ内のある2つのノードでレプリケーションを行う。オーバーヘッドは少ないが、多重障害に弱い。
*3:setAttribute呼び出し時のみレプリケーションする。getAttributeで取得したオブジェクトに対して変更を加えた場合、必ずsetAttributeを呼び出す必要がある。
*4:setAttribute/getAttribute呼び出し時にレプリケーションする。
*5:set&getとほぼ同じだが、プリミティブ型のラッパー型の場合はgetAttributeでレプリケーションしない。