Kem*_*mpe 5 session-replication cluster-computing liferay
我试图在tomcat上的liferay中启用会话复制而没有太多运气.我已经编写了一个小测试,以查看是否正在复制会话,并且它在我在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);
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么它不能在liferay-portlet中工作?我已将distributable添加到portlet/WEB-INF/web.xml
编辑1:版本
liferay 6.1.1
Tomcat 7.0.47
Run Code Online (Sandbox Code Playgroud)
编辑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);
Run Code Online (Sandbox Code Playgroud)
这次我只设置变量null.它在liferay之外的JSP中可以正常工作,但在liferay中它就像这样.
无论如何,哪个服务器获得第一个请求并不总是相同的结果
编辑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/
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果您想要正确的会话复制,您应该将门户以及所有插件声明为distributable. 原因是每个都是一个单独的 Web 应用程序。
然而,利用会话复制会产生大量开销。如果您出于性能原因构建集群,那么您会立即消耗掉相当多的附加性能。
标准建议(我知道,你不是在要求这个,但我希望在这里看到它,以便其他人稍后找到问题)是依赖粘性会话。如果您想关闭一个应用程序服务器,请将其从负载均衡器中取出,但保持其在线状态以服务已分配的会话一段时间(它们最终会耗尽)。不使用会话复制通常会显着降低所需的处理能力。是的,有些应用程序肯定需要会话复制,但我估计最初想要使用此功能的应用程序中只有 10%。