集群在很大程度上都是解决session共享问题
flex 集群也是一样。项目中没有用到flex的session 但是不管你用没用到session MessageBrokerServlet 都会帮你创建一个session
代码为:HttpFlexSession fs = httpFlexSessionProvider.getOrCreateSession(req);
如果不用session而每次都创建这也是一个不小的开销。而且用 nginx 转发多个服务的时候会有session不正确的问题
转决方法有二
1.一直访问第一次请求的那台服务 用nginx ip_hash可以解决(如果这台服务死了。仍有session问题,而且负载效果不是很明显)
2.将blazeds 的session阉割掉.. 会感觉凉快很多
本例用的blazeds版本为 4.0.1.17657
到刀修改两个类:MessageBrokerServlet,AbstractEndpoint
MessageBrokerServlet的service方法
// HttpFlexSession fs = httpFlexSessionProvider.getOrCreateSession(req);
Principal principal;
if(FlexContext.isPerClientAuthentication())
{
principal = FlexContext.getUserPrincipal();
}
else
{
// principal = fs.getUserPrincipal();
principal = null;
}
AbstractEndpoint的setupFlexClient
public FlexClient setupFlexClient(String id)
{
FlexClient flexClient = null;
if (id != null)
{
// This indicates that we're dealing with a non-legacy client that hasn't been
// assigned a FlexClient Id yet. Reset to null to generate a fresh Id.
if (id.equals(FlexClient.NULL_FLEXCLIENT_ID))
id = null;
flexClient = getMessageBroker().getFlexClientManager().getFlexClient(id);
// Make sure the FlexClient and FlexSession are associated.
//客户端设置不用session 这里取session 判断是否为空
//FlexSession session = FlexContext.getFlexSession();
//flexClient.registerFlexSession(session);
// And place the FlexClient in FlexContext for this request.
FlexContext.setThreadLocalFlexClient(flexClient);
}
return flexClient;
}
当然在实践中应尽量拓展不推荐用修改源码的方式
blazeds3阉割可以参考下面这个贴子:http://www.iteye.com/topic/875364