[Seasar-user:21708] Re: Tomcatでのセッションレプリケーション実装方法について

Hiroyuki Ohnaka [E-MAIL ADDRESS DELETED]
2013年 9月 3日 (火) 17:31:59 JST


もう一点ありました。

セッションレプリケーションが非同期で行われるため、setAttribute/getAttributeと
セッションレプリケーションの処理が競合する可能性があります。

このため、セッションに格納するオブジェクトはスレッドセーフにしてください。

例えばMapだったら java.util.concurrent.ConcurrentHashMap を使うなどしてください。

なお、この際 java.util.Collections#synchronizedMap 等のメソッドは、
このメソッドを通しても、コレクションAPIのシリアライズ・デシリアライズの処理が
スレッドセーフにならないという問題があるため、使用できないという点にも注意してください。

Tomcatのセッションレプリケーションの設定を同期モードにするという手もあるんですが、
パフォーマンス等にどう影響するのか、自分では検証が出来ていないです。




2013年9月3日 17:22 Hiroyuki Ohnaka <hiroyuki @ fieldnotes.jp>:

> 大中です。
>
> Tomcatのセッションレプリケーションはデフォルトがリクエストに対して非同期のため、
> TeedaのようなPageの処理の後リダイレクトするのが原則なフレームワークの場合、
> リダイレクトした後にリクエスト先のtomcatに(レプリケーションがまだ終わっていないため)
> セッション情報がとどかず、セッションの状態に不整合が起きる可能性があります。
> (自分が経験したのはTeedaでないフレームワークのため、あくまで可能性ですが...)
>
> これを避ける確実な方法は、スティッキーセッションを併用して、セッションレプリケーションは
> サーバーに障害が起きた場合の保険および、デプロイ時のセッション継続の手段として
> 使う、ということになります。
>
>
>
>
> 2013年9月3日 14:35 西村一昭 <k-nishimura @ ts.cnt.dnes.jp.nec.com>:
>
> お世話になっております。
>> 西村と申します。
>>
>> Tomcatでのセッションレプリケーションの実装方法についてお伺いします。
>>
>> 現在、
>> WEB(Apache)×3 - LB - AP(Tomcat)×2 - DB(MySQL)×1
>> の構成でTomcatでのセッションレプリケーションの実装を検討しています。
>>
>> 過去のMLを参考に下記のような実装を行おうと考えているのですが、
>> 何か過不足がありましたらご指摘をお願いします。
>>
>>
>> 1.Tomcatの設定
>> ・Tomcatのserver.xmlの<Cluster>タグのコメントアウトを解除し、有効にする
>> ・<Cluster>タグの<Valve className="〜.ReplicationValve"/>の除外対象から「.*\.html」を削除する
>>
>> 2.アプリの設定
>> ・web.xmlに「<distributable/>」を追記する
>> ・htmlで「<te:include>」を使用している箇所やForm部品にid属性を設定し、「name="_idXX"」が付与されないようにする
>>  ※「<te:include>」以外に注意が必要な個所はありますか?
>> ・FilterやIntercepterで明示的にHttpSession#setAttribute()を行う
>> インターセプタへの実装案:
>>     public class SessionSetAttributeInterceptor extends
>> AbstractInterceptor {
>>
>>         /** シリアルバージョンUID */
>>         private static final long serialVersionUID = 1L;
>>
>>         /**
>>          * インタセプタのポイントカット時に呼び出されるメソッド
>>          */
>>         public Object invoke(MethodInvocation methodInvocation) throws
>> Throwable {
>>
>>             Object ret = methodInvocation.proceed();
>>
>>             HttpSession httpSession =
>> SingletonS2Container.getComponent("session");
>>
>>             // ユーザ情報Dto
>>             Object objUserInfoDto =
>> httpSession.getAttribute("userInfoDto");
>>             httpSession.setAttribute("userInfoDto", objUserInfoDto);
>>
>>             //TODO その他セッション格納Dto
>>
>>             // Teeda Extension
>>             Object objPageScope =
>> httpSession.getAttribute(javax.faces.internal.scope.PageScope.class.getName());
>>
>> httpSession.setAttribute(javax.faces.internal.scope.PageScope.class.getName(),
>> objPageScope);
>>
>>             Object objSubApplicationScope =
>> httpSession.getAttribute(javax.faces.internal.scope.SubApplicationScope.class.getName());
>>
>> httpSession.setAttribute(javax.faces.internal.scope.SubApplicationScope.class.getName(),
>> objSubApplicationScope);
>>
>>             Object objRedirectScope =
>> httpSession.getAttribute(javax.faces.internal.scope.RedirectScope.class.getName());
>>
>> httpSession.setAttribute(javax.faces.internal.scope.RedirectScope.class.getName(),
>> objRedirectScope);
>>
>>             return ret;
>>         }
>>     }
>>
>> システム構成:
>> ・Redhat-Linux ES release 4
>> ・Apache2.0.52
>> ・jdk1.5.0.9
>> ・Tomcat 6.0.35
>> ・s2-framework 2.4.24
>> ・Teeda 1.0.13-sp6
>> ・MySQL 5.0.27
>>
>> 参考にしたML:
>> ・[Seasar-user:11433]
>> ・[Seasar-user:17881]
>> ・[Seasar-user:21674]
>>
>> _______________________________________________
>> Seasar-user mailing list
>> Seasar-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>
>
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20130903/ee585dca/attachment.html>


Seasar-user メーリングリストの案内