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