vlambda博客
学习文章列表

用Tomcat内置的Session复制方案实现Tomcat集群Session共享

实现过程


第1步

修改tomcat的server.xml文件,在 节点下,添加以下内容:

<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

    <ManagerclassName="org.apache.catalina.ha.session.DeltaManager"expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>

    <ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">

        <MembershipclassName="org.apache.catalina.tribes.membership.McastService"address="228.0.0.4"

                    port="45564"frequency="500" dropTime="3000" />

        <!-- 这里如果启动出现异常,则可以尝试把address中的"auto"改为"localhost" -->

        <ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"address="auto" port="4000"

                  autoBind="100"selectorTimeout="5000" maxThreads="6" />

        <SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">

            <TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>

        </Sender>

        <InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

        <InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>

    </Channel>

    <ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>

    <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

    <DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"tempDir="/tmp/war-temp/"

              deployDir="/tmp/war-deploy/"watchDir="/tmp/war-listen/" watchEnabled="false" />

    <ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

1234567891011121314151617181920

 


 

第2步

在项目的web.xml中添加如下节点:

<distributable/>


优缺点

 

优点

Java代码上不需要做任何修改


缺点

依赖应用服务器容器,这里是Tomcat,其他的容器是使用不了的;

适合小集群,不适合大集群,因为Session的复制是 all toall的,每个Tomcat都会存储其他的Session,会造成很大的资源浪费;

在高并发的情况下延迟较为严重且占用网络资源。