本文基於一個全國性高並發通信平台的實戰經驗,系統闡述面向企業級的分布式架構設計。系統採用 Maven、SpringMVC、MyBatis、Shiro、Druid、Dubbo、ZooKeeper、Redis、FastDFS、ActiveMQ 等技術棧,核心目標滿足海量數據存儲、請求分布式調度、多節點部署與雙重熱備切換四大核心需求。
系統採用四層節點架構,每層均可水平擴展:
public String getTargetServerIp() {
String[] ips = getTargetServerIps();
int[] ids = getTargetServerIds();
int index = currentTargetServerIndex;
boolean working = false;
while (!working) {
index = (currentTargetServerIndex + 1) % ids.length;
working = isServerWorking(index);
if (!working && index == currentTargetServerIndex) return "0:0"; // 全不可用
}
currentTargetServerIndex = index;
return ips[index];
}
public int getTargetServerGroupIndexByHash(String param) {
byte[] bytes = param.getBytes(StandardCharsets.UTF_8);
int hash = 0;
for (byte b : bytes) hash = 31 * hash + b; // JDK String.hashCode()
int frameCount = 2; // 群組數
int step = 100 / frameCount;
int h = Math.abs(hash % 100);
for (int i = 0, begin = 0, end = step; i < frameCount; i++) {
if (begin <= h && h < end) return 2 * i;
begin = end;
end += step;
}
return 2 * (frameCount - 1);
}
群組內再調用輪詢邏輯選擇具體節點,實現「同一用戶請求固定落在同一群組,群組內均衡分發」。
Client/Server 統一採用「構建-隊列-發送/接收-處理」管道:
RequestBuilder → RequestQueue → 專用線程 RequestScanner 調用 RequestSender 發送。支援多隊列、優先級策略。RequestAccepter 接收入隊 → 工作線程池調用 RequestHandler 處理 → 返回 Response。通信協議基於 Java NIO Socket,遵循兩大原則:
後續將介紹基於 Linux 的高可用集群部署實戰(Keepalived、LVS、ZooKeeper 選主等)。