WebSocket集群方案解析與實現

一、WebSocket集群核心挑戰

1.1 關鍵問題分析

會話保持
多節點同步
消息路由
精準投遞
水平擴展
負載均衡

1.2 方案對比矩陣

方案類型實現復雜度網絡開銷可靠性適用場景
廣播方案小規模集群
目標詢址中大規模系統
共享存儲高一致性要求

二、廣播方案深度實現

2.1 服務端核心邏輯

@ServerEndpoint("/websocket/{businessType}/{userId}")
@Component
public class BroadcastWebSocket {private static final Map<String, Session> LOCAL_SESSIONS = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(@PathParam("userId") String userId, Session session) {LOCAL_SESSIONS.put(userId, session);// 可添加Redis訂閱邏輯}@MessageMapping("/topic/notify")@SendToUser("/queue/notice")public void handleBroadcast(Message message) {// 消息處理邏輯}
}

2.2 消息消費者實現

@Component
@RequiredArgsConstructor
public class OrderMessageConsumer {private final SimpMessagingTemplate messagingTemplate;@RabbitListener(queues = "order.queue")public void handleOrderMessage(OrderMessage message) {messagingTemplate.convertAndSendToUser(message.getUserId(),"/queue/orders",message.getContent());}
}

三、目標詢址方案完整實現

3.1 服務注冊與發現

@Configuration
public class ServiceRegistryConfig {@Bean@ConditionalOnMissingBeanpublic ServiceInstance serviceInstance(@Value("${server.port}") int port,@Value("${spring.application.name}") String appName) {return new DefaultServiceInstance(appName + "-" + IdUtil.simpleUUID(),appName,getLocalHost(),port,false);}private String getLocalHost() {try {return InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {return "127.0.0.1";}}
}

3.2 路由服務實現

@Service
public class RoutingService {private final DiscoveryClient discoveryClient;private final RedisTemplate<String, String> redisTemplate;public String getTargetService(String userId) {String serviceName = redisTemplate.opsForHash().get("ws:mapping", userId);return discoveryClient.getInstances(serviceName).stream().findFirst().map(instance -> instance.getUri().toString()).orElseThrow();}
}

3.3 Feign客戶端配置

@FeignClient(name = "ws-client", configuration = FeignConfig.class)
public interface WsClient {@PostMapping("/push/{userId}")void pushMessage(@PathVariable String userId,@RequestBody PushMessage message);class FeignConfig {@Beanpublic RequestInterceptor routingInterceptor(RoutingService routingService) {return template -> {String userId = template.pathVariables().get("userId");String baseUrl = routingService.getTargetService(userId);template.target(baseUrl);};}}
}

四、生產環境優化策略

4.1 會話健康檢查

@Scheduled(fixedRate = 30000)
public void checkAliveSessions() {LOCAL_SESSIONS.forEach((userId, session) -> {try {session.getAsyncRemote().sendPing(ByteBuffer.wrap("HB".getBytes()));} catch (Exception e) {LOCAL_SESSIONS.remove(userId);redisTemplate.opsForHash().delete("ws:mapping", userId);}});
}

4.2 負載均衡策略

spring:cloud:loadbalancer:configurations: zone-preferencenacos:discovery:cluster-name: ${ZONE:default}

五、異常處理與容災

5.1 回退機制實現

@Slf4j
public class WsClientFallback implements WsClient {private final MessageStore messageStore;@Overridepublic void pushMessage(String userId, PushMessage message) {messageStore.saveUndelivered(userId, message);log.warn("消息暫存,等待重試: {}", message);}
}

5.2 消息重試隊列

@Bean
public MessageRecoveryRecovery recoveryStrategy() {return new ExponentialBackOffRecovery() {@Overridepublic void recover(Message message) {// 自定義重試邏輯}};
}

六、性能監控方案

6.1 監控指標采集

@Bean
public MeterBinder wsMetrics(WebSocketSessionRegistry registry) {return registry -> {Gauge.builder("websocket.sessions",() -> registry.getSessionCount()).register(registry);};
}

6.2 Grafana監控面板

{"panels": [{"title": "WebSocket Sessions","targets": [{"expr": "sum(websocket_sessions_active)","legendFormat": "Active Sessions"}]}]
}

七、方案選型決策指南

在這里插入圖片描述

總結與建議

  1. 中小型項目:優先采用廣播方案,配合Redis Pub/Sub實現簡單集群
  2. 中大型系統:采用目標詢址方案,確保消息精準投遞
  3. 關鍵業務:實現雙保險機制,結合兩種方案優勢
  4. 性能優化:重點監控會話數量和消息延遲指標
  5. 容災設計:必須實現消息持久化和重試機制

示例項目結構建議:

websocket-cluster/
├── ws-common       # 公共組件
├── ws-gateway      # 接入層
├── ws-node1        # 節點1
├── ws-node2        # 節點2
└── ws-monitor      # 監控服務

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93016.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用dify搭建hr簡歷助手-上傳簡歷-對接飛書ai表格

一、需求背景 hr在招聘平臺獲取簡歷后&#xff0c;想整理到簡歷庫&#xff0c;在線管理和維護&#xff0c;及其不方便&#xff0c;所以用dify搭建一個簡歷上傳助手&#xff0c;并且能保存到線上表格&#xff0c;方便維護和查看。 先看下最終的效果我們的工作流即可自動獲取文件…

《算法導論》第 22 章 - 基本的圖算法

大家好&#xff01;今天我們來深入學習《算法導論》第 22 章的基本圖算法。圖論是計算機科學中的重要基礎&#xff0c;這些基本算法是解決很多復雜問題的基石。本文將結合代碼實現&#xff0c;幫助大家更好地理解和應用這些算法。思維導圖22.1 圖的表示在計算機中&#xff0c;圖…

基于PROFINET的西門子PLC通訊:S7-200與S7-1200在自動化倉儲中的協同應用

一.行業痛點與解決方案傳統倉儲物流系統中&#xff0c;采用西門子SMARTS7-200PLC&#xff08;如CPUSR20、SR30等型號&#xff09;的設備往往面臨三大通訊難題&#xff1a;一是無法直接接入以太網網絡&#xff0c;導致多PLC間的數據交互需要通過復雜的串口級聯實現&#xff0c;響…

redis實現秒殺超賣問題的解決方案:(僅限于單體項目)

秒殺實現通過樂觀鎖控制超賣問題通過悲觀鎖控制每個用戶只能下一單&#xff0c;避免用戶多次點擊&#xff0c;發送的多次下單請求(即多個線程)都成功&#xff0c;避免惡意攻擊每個請求訪問Tomcat時&#xff0c;就會分配一個線程處理請求業務邏輯&#xff1a;注*以下邏輯中報錯也…

Go與Python爬蟲實戰對比:從開發效率到性能瓶頸的深度解析

目錄 引言&#xff1a;兩種語言&#xff0c;兩種哲學 開發效率對比&#xff1a;從框架設計看易用性 Python的"開箱即用" Go的"手動組裝" 性能對比&#xff1a;從并發模型看效率差異 理論性能對比 實際測試數據 錯誤處理對比&#xff1a;從編程范式…

初識c語言————排序方法

今天我們學習的是c語言中的排序方法目錄&#xff1a;一.冒泡排序法二.選擇排序法下面我們正式學習c語言中的排序方法一.冒泡排序法1.冒泡排序法的過程&#xff1a;將無序的數組通過數組之間的大小比較&#xff0c;排成有序的樣子2.例如&#xff1a;5&#xff0c;3&#xff0c;4…

爬蟲與數據分析結合案例:中國大學排名爬取與分析全流程

爬蟲與數據分析結合案例&#xff1a;中國大學排名爬取與分析全流程 一、案例背景與目標 本案例以高三網中國大學排名&#xff08;網址&#xff1a;2021中國的大學排名一覽表_高三網&#xff09;為數據源&#xff0c;完成從數據爬取到分析可視化的全流程實踐。主要目標包括&am…

行業分享丨SimSolid 在汽車零部件開發中應用的可行性調研及實踐

*本文源自汽車行業用戶范會超投稿1、背景車型短周期開發背景下&#xff0c;高效的仿真技術顯得尤為重要。Altair 推出了多款加速設計/仿真的軟件&#xff0c;其中無網格軟件 SimSolid 與業務有一定的契合度&#xff0c;有必要論證其在汽車零部件結構分析領域的可行性。2、目標評…

MacOS字體看起來比在 Windows 上更好?

字體控們注意啦&#xff01;&#x1f389;你們有沒有發現&#xff0c;同樣一段文字&#xff0c;在Mac和Windows上看起來就是不一樣&#xff1f;Mac上的字仿佛自帶柔光濾鏡&#xff0c;圓潤又舒適&#xff1b;而Windows上的字則像是精心雕琢的刀鋒&#xff0c;銳利且清晰。這背后…

Torch -- 卷積學習day1 -- 卷積層,池化層

目錄 一、CNN概述 二、卷積層 1、卷積核 2、卷積計算 3、邊緣填充 4、步長 5、多通道卷積計算 6、多卷積核卷積計算 7、特征圖大小 8、卷積參數共享 9、局部特征提取 10、卷積層API 三、池化層 1、池化層概述 1.池化層的作用 2.池化層類型 2、池化層計算 3、步…

藍橋杯---第六屆省賽單片機組真題

先出手寫的代碼&#xff0c;代碼分析還需要一段時間&#xff0c;不難&#xff0c;大家認真寫。#include <STC15F2K60S2.H> #include "Seg.h" #include "LED.h" #include "Key.h" #include "DS1302.h" #include "DS18B20.h&…

GPT-5深度解析:精準、高效、務實的新一代AI引擎

&#x1f31f; GPT-5深度解析&#xff1a;精準、高效、務實的新一代AI引擎在萬眾矚目中&#xff0c;OpenAI于2025年8月7日正式推出GPT-5——這一代模型沒有華麗的創意革命&#xff0c;卻以驚人的準確率提升、斷崖式降價和強大的工程能力&#xff0c;悄然重塑了生成式AI的應用邊…

oss(阿里云)前端直傳

WEB端前端直傳 參考文檔&#xff1a;web前端直傳并設置上傳回調 封裝oss-upload.ts // 圖片上傳 import { uploadToken } from /api/uploadFile.js // 獲取oss token接口// 定義 OSS 信息類型 interface OssInfo {policy: string;signature: string;x_oss_credential: strin…

vscode uv 發布一個python包:編輯、調試與相對路徑導包

背景 最近一直在使用uv做python包管理&#xff0c;用起來很方便。 尤其是在代碼上傳到github的時候&#xff0c;pyproject.toml 會顯示出當前項目依賴的python包。這樣在把代碼下載到本地之后&#xff0c;直接uv sync就可以很方便地恢復出python環境。 uv 除了有上述優點&…

Secure 第四天作業

實驗需求&#xff1a;需求一拓撲&#xff1a;按照以上拓撲所示&#xff0c;完成以下需求&#xff1a;參考以上拓撲&#xff0c;配置設備IP地址&#xff0c;使用UNL里Secure第四天拓撲即可。&#xff08;有興趣的同學課后也可按照PPT原拓撲做做實驗&#xff09;&#xff1b;配置…

利用開漏輸出模式模擬IIC

/************************************************************利用IO口模擬IIC時序&#xff0c;需要使用2個IO口(SDA和SCL)SCL時鐘線只能由主器件進行控制&#xff0c;所以SCL引腳必須為輸出模式SDA數據線&#xff0c;在主器件發送數據時&#xff0c;SDA引腳為輸出模式SDA數…

閘機控制系統從設計到實現全解析:第 5 篇:RabbitMQ 消息隊列與閘機通信設計

第 5 篇&#xff1a;RabbitMQ 消息隊列與閘機通信設計RabbitMQ 是一款開源的消息隊列中間件&#xff08;Message Queue&#xff0c;MQ&#xff09;&#xff0c;基于 Erlang 語言開發&#xff0c;遵循 AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高級消息隊…

Linux 常用命令大全:覆蓋日常 99% 操作需求

1、基本命令 pwd&#xff1a;顯示當前工作目錄的絕對路徑&#xff0c;例如在復雜目錄結構中快速確認位置&#xff0c;執行后會輸出類似/home/user/documents的結果。 cd&#xff1a;切換目錄&#xff0c;cd 目錄路徑可進入指定目錄&#xff0c;cd ~回到當前用戶的家目錄&…

普通電腦與云電腦的區別有哪些?全面科普

近年來&#xff0c;越來越多的人不再購置升級自己的電腦&#xff0c;轉而選擇云電腦&#xff0c;云端產品正在變得越來越普及易用。那么它究竟跟我們的普通本地設備有什么區別吶&#xff1f;或許很多人并不知悉&#xff0c;對此&#xff0c;本篇內容小編就為大家簡要科普一下普…

【Python】支持向量機SVM

示例代碼&#xff1a;import numpy as np import matplotlib.pyplot as plt from sklearn import svm from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report# 設…