Liferay 集群 session 复制

标签 liferay cluster-computing session-replication

我正在尝试在 tomcat 上的 liferay 中启用 session 复制,但运气不佳。我编写了一个小测试来查看 session 是否被复制,并且它在我放置在 webapps/examples 下的单独 JSP 文件中运行良好,但是当我在 liferay-porlet 中输入相同的代码时,只有 JSESSION 是正确的。

   HttpSession httpSession = request.getSession();
   String testTime = (String) httpSession.getAttribute("testTime");
   String before = testTime;

   testTime = Long.toString(System.currentTimeMillis());
   httpSession.setAttribute("testTime", testTime);

   String sessionid = httpSession.getId();
   System.out.println("JSESSIONID:    "+sessionid);
   System.out.println("TEST TIME WAS: "+before);
   System.out.println("TEST TIME IS:  "+testTime);

有人知道为什么它在 liferay-portlet 中不起作用吗?我已将可分发添加到 portlet/WEB-INF/web.xml

编辑 1:版本

liferay 6.1.1
Tomcat 7.0.47

编辑2:我尝试了另一个测试。

   HttpSession httpSession = request.getSession();
   String testTime = (String) httpSession.getAttribute("testTime");
   String before = testTime;

   if(testTime == null) {
       testTime = Long.toString(System.currentTimeMillis());
       httpSession.setAttribute("testTime", testTime);
   }

   String sessionid = httpSession.getId();
   System.out.println("JSESSIONID:    "+sessionid);
   System.out.println("TEST TIME WAS: "+before);
   System.out.println("TEST TIME IS:  "+testTime);

这次我只设置变量为空。它在 liferay 之外的 JSP 中按预期工作,但在 liferay 内它是这样的。

  1. 第一个获取请求的服务器获取 null 并设置变量
  2. 当其他服务器收到请求时,它也会获取 null 并设置变量
  3. 当收到第一个请求的服务器尝试获取变量时,它会从第二个服务器获取值。所以现在它被复制了。

哪个服务器收到第一个请求并不重要,无论如何它总是相同的结果

编辑4.集群信息

节点:2 负载均衡器:

    <Proxy balancer://mycluster>
            BalancerMember ajp://node1:8009 route=tomcat1 loadfactor=1
            BalancerMember ajp://node2:8009 route=tomcat2 loadfactor=1

            Order Deny,Allow
            Deny from none
            Allow from all

            ProxySet lbmethod=byrequests
    </Proxy>
    <Location /balancer-manager>
            SetHandler balancer-manager
            Order deny,allow
            Allow from all
    </Location>

    ProxyPass /balancer-manager !
    ProxyPass / balancer://mycluster/

portal-ext.properties

cluster.link.enabled=true
jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.url=jdbc:mysql://dbserver:3306/lportal?autoReconnect&autoReconnectForPools;&useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=u jdbc.default.password=p

spring.configs=\
        META-INF/base-spring.xml,\
        \
        META-INF/hibernate-spring.xml,\
        META-INF/infrastructure-spring.xml,\
        META-INF/management-spring.xml,\
        \
        META-INF/util-spring.xml,\
        \
        META-INF/jpa-spring.xml,\
        \
        META-INF/executor-spring.xml,\
        \
        META-INF/audit-spring.xml,\
        META-INF/cluster-spring.xml,\
        META-INF/editor-spring.xml,\
        META-INF/jcr-spring.xml,\
        META-INF/ldap-spring.xml,\
        META-INF/messaging-core-spring.xml,\
        META-INF/messaging-misc-spring.xml,\
        META-INF/mobile-device-spring.xml,\
        META-INF/notifications-spring.xml,\
        META-INF/poller-spring.xml,\
        META-INF/rules-spring.xml,\
        META-INF/scheduler-spring.xml,\
        META-INF/scripting-spring.xml,\
        META-INF/search-spring.xml,\
        META-INF/workflow-spring.xml,\
        \
        META-INF/counter-spring.xml,\
        META-INF/mail-spring.xml,\
        META-INF/portal-spring.xml,\
        META-INF/portlet-container-spring.xml,\
        META-INF/staging-spring.xml,\
        META-INF/virtual-layouts-spring.xml,\
        \
        META-INF/dynamic-data-source-spring.xml,\
        #META-INF/shard-data-source-spring.xml,\
        #META-INF/memcached-spring.xml,\
        #META-INF/monitoring-spring.xml,\
        \
        META-INF/ext-spring.xml

最佳答案

如果您想要正确的 session 复制,您应该将门户以及所有插件声明为可分发。原因是每个都是一个单独的 Web 应用程序。

但是,利用 session 复制会产生大量开销。如果您出于性能原因构建集群,那么您会立即消耗掉相当多的附加性能。

标准建议(我知道,你不是在要求这个,但我希望在这里看到它,以便其他人稍后找到问题)是依赖粘性 session 。如果您想关闭一个应用程序服务器,请将其从负载均衡器中取出,但保持其在线状态以服务已分配的 session 一段时间(它们最终会耗尽)。不使用 session 复制通常会显着降低所需的处理能力。是的,有些应用程序肯定需要 session 复制,但我估计最初想要使用此功能的应用程序只有 10%。

关于Liferay 集群 session 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21749687/

相关文章:

hadoop - 从节点不在 Yarn ResourceManager 中

amazon-web-services - AWS 上的 memcached-session-manager

GCE 上的 Hadoop 实例

hadoop - 在异构环境中设置 2 节点 Hadoop 集群,即一台 64 位机器和另一台 32 位机器?

google-analytics - Liferay 中是否有内置的谷歌分析替代方案

java - 如何在 Liferay portlet 中设置 Cookie?

tomcat - 在不使 session 属性可序列化的情况下,是否可以在 tomcat 中进行 session 复制?

apache - 启用集群后始终会重新创建 session

java - 使用 Java/Liferay 读取 PDF 文件并将其再次保存为 PDF

Liferay Service Builder 表在每次部署时自动递增