在複雜的企業級應用環境中,單一應用伺服器往往難以承擔所有服務請求,因此企業通常部署多個伺服器實例組成叢集。這種架構不僅易於擴展,更支援負載平衡與失效轉移,使後端伺服器故障對客戶端保持透明。WebLogic 叢集提供多層次的負載平衡策略,針對 Web 應用、JNDI、JMS、EJB 及 JDBC 等不同層面皆有獨特實現機制。
當客戶端透過代理(如 Apache、HttpClusterServlet、IIS)訪問叢集業務頁面時,代理採用輪詢演算法分發請求。對於攜帶 Session 的同一客戶端,WebLogic 採用 Session 親和機制將請求導向主伺服器;若主伺服器不可用,則轉發至其他伺服器。Session 親和支援三種實現方式:
response.encodeURL() 將 Session ID 附加於 URL。以 HttpClusterServlet 為例,其核心邏輯維護一個受管伺服器列表,每次分發請求後索引遞增,實現基本輪詢:
public synchronized Server next() {
if (list.size() == 0) return null;
if (index == -1) index = (int)(Math.random() * list.size());
else index = ++index % list.size();
Object[] servers = list.values().toArray();
return (Server) servers[index];
}
獲取 JDBC、JMS 連線或 EJB Stub 等 RMI 物件時需初始化 InitialContext。若 Provider URL 指定多個伺服器(如 t3://localhost:7011,localhost:7021),客戶端建立 Context 時會依輪演算法分散連線至不同 Managed Server。值得注意的是:
分散式佇列為邏輯佇列,管理分佈於不同 JMS Server 的實體佇列。其負載平衡由連線工廠與佇列配置共同決定:
send() 皆負載平衡;停用時僅首次平衡。JMS Connection 建立時採輪詢分散至不同 Managed Server,建立後 Producer/Consumer 固定於該連線對應伺服器,訊息分發再由上述參數控制。
EJB 負載平衡涉及三個層面:
home-load-algorithm 配置(round-robin、random、weight-based 及其 Affinity 變體),控制 create() 分發邏輯。stateless-bean-load-algorithm。有狀態 Bean 與 Entity Bean 因狀態同步開銷大,不支援負載平衡。配置 Multi Pool 作為邏輯池管理多個實體池,演算法分為 HA(僅故障轉移)與 Load Balance(平時負載平衡、故障時轉移)兩種模式。
