天天看點

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

繼續閱讀