天天看点

flex 集群问题

集群在很大程度上都是解决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

继续阅读