Asp.Net Core SignalR的分布式部署

文章目錄

  • 前言
  • 一、核心
  • 二、解決方案架構
  • 三、實現方案
    • 1.使用 Azure SignalR Service
    • 2.Redis Backplane(Redis 背板方案)
    • 3.負載均衡配置
      • 粘性會話要求
      • 無粘性會話方案(僅WebSockets)
      • 完整部署示例(Redis + Docker)
      • 性能優化技巧
      • 監控與故障排查
      • 安全注意事項
  • 四、部署策略選擇
  • 總結


前言

在分布式環境中部署 SignalR 應用需要解決連接狀態管理和消息廣播問題

一、核心

  • 連接狀態:默認存儲在內存中,多服務器無法共享

  • 消息廣播:需要跨服務器分發消息

  • 負載均衡:需要粘性會話或替代方案

二、解決方案架構

在這里插入圖片描述

三、實現方案

1.使用 Azure SignalR Service

  1. Program.cs
    // Program.cs
    var builder = WebApplication.CreateBuilder(args);// 添加Azure SignalR服務
    builder.Services.AddSignalR().AddAzureSignalR(options => {options.ConnectionString = builder.Configuration["Azure:SignalR:ConnectionString"];options.ServerStickyMode = ServerStickyMode.Required; // 必需粘性會話});var app = builder.Build();// 配置路由
    app.MapHub<MyHub>("/myHub");
    app.Run();
    
  2. 優點
    • 完全托管服務
    • 自動處理擴展
    • 無需管理基礎設施

2.Redis Backplane(Redis 背板方案)

  1. 安裝NuGet包

    Install-Package Microsoft.AspNetCore.SignalR.StackExchangeRedis
    
  2. Program.cs配置

     //redisConnectionString為Redis服務器地址
    builder.Services.AddSignalR().AddStackExchangeRedis(redisConnectionString, options => {options.Configuration.ChannelPrefix = "MyAppSignalR"; // 通道前綴});

3.負載均衡配置

粘性會話要求

  1. 示例:
    # Nginx 配置
    upstream signalr_servers {ip_hash; # 基于客戶端IP的粘性會話server server1.example.com;server server2.example.com;server server3.example.com;
    }server {location / {proxy_pass http://signalr_servers;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}
    }
    

無粘性會話方案(僅WebSockets)

  1. 示例:
    	// 創建新連接state.connection = new signalR.HubConnectionBuilder().withUrl(state.serverUrl, {skipNegotiation: true, // 嘗試跳過協商步驟transport: signalR.HttpTransportType.WebSockets // 強制使用 WebSockets}).withAutomaticReconnect({nextRetryDelayInMilliseconds: retryContext => {state.retryCount = retryContext.previousRetryCount + 1;return Math.min(1000 * Math.pow(2, state.retryCount), 30000);}}).configureLogging(signalR.LogLevel.Debug) // 啟用詳細調試日志.build();
    

完整部署示例(Redis + Docker)

  1. docker-compose.yml

    version: '3.8'services:webapp:image: my-signalr-appbuild: .environment:- Redis__ConnectionString=redis:6379ports:- "5000:80"depends_on:- redisredis:image: redis:alpineports:- "6379:6379"
    
  2. 應用配置

    // Program.cs
    var redisConnection = builder.Configuration["Redis:ConnectionString"];if (!string.IsNullOrEmpty(redisConnection))
    {builder.Services.AddSignalR().AddStackExchangeRedis(redisConnection, options => {options.Configuration.ChannelPrefix = "SignalR_My";});
    }
    else
    {builder.Services.AddSignalR();
    }
    

性能優化技巧

  • 協議優化
    builder.services.AddSignalR(options => 
    {options.EnableDetailedErrors = false; // 生產環境關閉options.MaximumReceiveMessageSize = 32 * 1024; // 32KB
    }).AddMessagePackProtocol(); // 二進制協議
    
  • 橫向擴展
    .AddStackExchangeRedis(connection, options => 
    {options.Configuration.AbortOnConnectFail = false;options.Configuration.ConnectRetry = 5;options.Configuration.ConnectTimeout = 10000;
    });
    
  • 狀態管理與持久化
    • 在分布式環境中,要避免使用服務器本地狀態:
      • 不要在 Hub 類中存儲客戶端狀態,應使用外部存儲(如 Redis、數據庫)。
      • 考慮使用分布式緩存來存儲群組信息。
      public class ChatHub : Hub
      {private readonly IRedisCache _cache; // 使用外部緩存public ChatHub(IRedisCache cache){_cache = cache;}// 使用緩存存儲用戶信息public override async Task OnConnectedAsync(){await _cache.AddUser(Context.ConnectionId, Context.UserIdentifier);await base.OnConnectedAsync();}
      }
      

監控與故障排查

  • 分布式環境下的監控尤為重要:
    • 使用 Azure Application Insights 或 Elastic Stack 監控 SignalR 連接和消息。
    • 實現自定義日志記錄,跟蹤消息路由和連接狀態。
    • 配置健康檢查端點,監控各個服務器實例的狀態

安全注意事項

  • 對所有 SignalR 通信使用 HTTPS。
  • 在負載均衡器上配置 SSL/TLS 終止。
  • 考慮使用 Azure AD 或 JWT 進行身份驗證。

四、部署策略選擇

  • 根據實際需求選擇合適的部署方案:
    • Azure 環境:推薦使用 Azure SignalR 服務 + Azure App Service。
    • 自托管環境:使用 Redis Backplane + Kubernetes 或 Docker Swarm。
    • 混合云環境:結合 Azure SignalR 服務與本地部署。

總結

  • 分布式部署 SignalR 的關鍵在于:
    • 使用消息代理實現服務器間通信。
    • 合理配置負載均衡器,支持會話親和性和 WebSocket。
    • 避免使用服務器本地狀態,采用外部存儲。
    • 加強監控,及時發現并解決問題。

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

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

相關文章

L2-054 三點共線 - java

L2-054 三點共線 語言時間限制內存限制代碼長度限制棧限制Java (javac)2600 ms512 MB16KB8192 KBPython (python3)2000 ms256 MB16KB8192 KB其他編譯器2000 ms64 MB16KB8192 KB 題目描述&#xff1a; 給定平面上 n n n 個點的坐標 ( x _ i , y _ i ) ( i 1 , ? , n ) (x\_i…

【 java 基礎知識 第一篇 】

目錄 1.概念 1.1.java的特定有哪些&#xff1f; 1.2.java有哪些優勢哪些劣勢&#xff1f; 1.3.java為什么可以跨平臺&#xff1f; 1.4JVM,JDK,JRE它們有什么區別&#xff1f; 1.5.編譯型語言與解釋型語言的區別&#xff1f; 2.數據類型 2.1.long與int類型可以互轉嗎&…

高效背誦英語四級范文

以下是結合認知科學和實戰驗證的 ??高效背誦英語作文五步法??&#xff0c;助你在30分鐘內牢固記憶一篇作文&#xff0c;特別適配考前沖刺場景&#xff1a; &#x1f4dd; ??一、解構作文&#xff08;5分鐘&#xff09;?? ??拆解邏輯框架?? 用熒光筆標出&#xff…

RHEL7安裝教程

RHEL7安裝教程 下載RHEL7鏡像 通過網盤分享的文件&#xff1a;RHEL 7.zip 鏈接: https://pan.baidu.com/s/1ExLhdJigj-tcrHJxIca5XA?pwdjrrj 提取碼: jrrj --來自百度網盤超級會員v6的分享安裝 1.打開VMware&#xff0c;新建虛擬機&#xff0c;選擇自定義然后下一步 2.點擊…

結構型設計模式之Decorator(裝飾器)

結構型設計模式之Decorator&#xff08;裝飾器&#xff09; 前言&#xff1a; 本案例通過李四舉例&#xff0c;不改變源代碼的情況下 對“才藝”進行增強。 摘要&#xff1a; 摘要&#xff1a; 裝飾器模式是一種結構型設計模式&#xff0c;允許動態地為對象添加功能而不改變其…

Kotlin委托機制使用方式和原理

目錄 類委托屬性委托簡單的實現屬性委托Kotlin標準庫中提供的幾個委托延遲屬性LazyLazy委托參數可觀察屬性Observable委托vetoable委托屬性儲存在Map中 實踐方式雙擊back退出Fragment/Activity傳參ViewBinding和委托 類委托 類委托有點類似于Java中的代理模式 interface Base…

SpringBoot接入Kimi實踐記錄輕松上手

kimi簡單使用 什么是Kimi API 官網&#xff1a;https://platform.moonshot.cn/ Kimi API 并不是一個我所熟知的廣泛通用的術語。我的推測是&#xff0c;你可能想問的是關于 API 的一些基礎知識。API&#xff08;Application Programming Interface&#xff0c;應用程序編程接…

書籍在其他數都出現k次的數組中找到只出現一次的數(7)0603

題目 給定一個整型數組arr和一個大于1的整數k。已知arr中只有1個數出現了1次&#xff0c;其他的數都出現了k次&#xff0c;請返回只出現了1次的數。 解答&#xff1a; 對此題進行思路轉換&#xff0c;可以將此題&#xff0c;轉換成k進制數。 k進制的兩個數c和d&#xff0c;…

React 項目初始化與搭建指南

React 項目初始化有多種方式&#xff0c;可以選擇已有的腳手架工具快速創建項目&#xff0c;也可以自定義項目結構并使用構建工具實現項目的構建打包流程。 1. 腳手架方案 1.1. Vite 通過 Vite 創建 React 項目非常簡單&#xff0c;只需一行命令即可完成。Vite 的工程初始化…

大模型模型推理的成本過高,如何進行量化或蒸餾優化

在人工智能的浪潮中,大模型已經成為推動技術革新的核心引擎。從自然語言處理到圖像生成,再到復雜的多模態任務,像GPT、BERT、T5這樣的龐大模型展現出了驚人的能力。它們在翻譯、對話系統、內容生成等領域大放異彩,甚至在醫療、金融等行業中也開始扮演重要角色。可以說,這些…

機器學習在多介質環境中多污染物空間預測的應用研究

機器學習在多介質環境中多污染物空間預測的應用研究 1. 引言 1.1 研究背景與意義 隨著工業化和城市化進程加速,環境中多種污染物的共存已成為全球性環境問題。重金屬(如鉛、汞、鎘)、有機污染物(如多環芳烴、農藥殘留)和新興污染物(如微塑料、藥品殘留)在空氣、水體、…

圖解深度學習 - 激活函數和損失函數

激活函數和損失函數在深度學習中扮演著至關重要的角色。通過選擇合適的激活函數和損失函數&#xff0c;可以顯著提高神經網絡的表達能力和優化效果。 其中激活函數是神經網絡中的非線性函數&#xff0c;用于在神經元之間引入非線性關系&#xff0c;從而使模型能夠學習和表示復…

影響服務器穩定性的因素都有什么?

服務器的穩定性會影響到業務是否能夠持續運行&#xff0c;用戶在進行訪問網站的過程中是否出現頁面卡頓的情況&#xff0c;本文就來了解一下都是哪些因素影響著服務器的穩定性。 服務器中的硬件設備是保證服務器穩定運行的基礎&#xff0c;企業選擇高性能的處理器和大容量且高速…

TopCode之最大子數組和

題目鏈接 53. 最大子數組和 - 力扣&#xff08;LeetCode&#xff09; 題目解析 算法原理 解法1: 暴力(一個循環用來固定,一個用來找最大的子數組O(n^2),每次往后拓展一個元素就判斷是否是最長的),枚舉出每一種情況, 然后不斷更新最大的 解法二: dp 1> dp的含義: dp[i]記…

深入解析 Flask 命令行工具與 flask run命令的使用

Flask 是一個輕量級的 Python Web 應用框架&#xff0c;其內置的命令行工具&#xff08;CLI&#xff09;基于 Click 庫&#xff0c;提供了方便的命令行接口&#xff0c;用于管理和運行 Flask 應用程序。本文將詳細介紹 Flask 命令行工具的功能&#xff0c;以及如何使用 flask r…

QFramework v1.0 Guide: 工具篇——ViewControllor, ActionKit時序動作執行系統,ResKit資源管理開發解決方案

目錄 一、QFramework.Toolkits簡介 二、View Controllor 1、作用 2、應用場景 3、示例 三、ActionKit時序動作執行系統 1. 用法 &#xff08;1&#xff09;延時回調 &#xff08;2&#xff09;序列執行 &#xff08;3&#xff09;幀延時 &#xff08;4&#xff09;條…

GLIDE論文閱讀筆記與DDPM(Diffusion model)的原理推導

Abstract 擴散模型&#xff08;Diffusion model&#xff09;最近被證明可以生成高質量的合成圖像&#xff0c;尤其是當它們與某種引導技術結合使用時&#xff0c;可以在生成結果的多樣性與保真度之間進行權衡。本文探討了在文本條件圖像生成任務中使用擴散模型&#xff0c;并比…

@Pushgateway 數據自動清理

文章目錄 Pushgateway 數據自動清理一、Pushgateway 數據清理的必要性二、自動清理方案方案1&#xff1a;使用帶TTL功能的Pushgateway分支版本方案2&#xff1a;使用Shell腳本定期清理方案3&#xff1a;結合Prometheus記錄規則自動清理 三、最佳實踐建議四、驗證與維護五、示例…

QML視圖組件ListView、TableView、GridView介紹

1 MVD模型 Model:模型,包含數據及其結構。View:視圖,用于顯示數據。Delegate:代理,規定數據在視圖中的顯示方式。2 ListView 以列表形式展示數據。2.1 屬性 model:設置或獲取列表視圖的數據模型delegate:定義了列表中每一項的外觀和行為currentIndex:獲取或設置當前選…

解決vscode打開一個單片機工程文件(IAR/keil MDK)因無法找到頭文件導致的結構體成員不自動補全問題。

最近一直在用vscode安裝c/c插件后編輯STM32標準庫&#xff08;keil MDK&#xff09;項目源文件&#xff0c;因為我感覺vscode在代碼編輯方面比keil MDK本身優秀太多。發現打開工程后&#xff0c;結構體變量的成員在輸入“.”后不自己彈出的問題&#xff0c;后來查找各方資料&am…