Asp.Net Core SignalR的分布式部署

article/2025/6/25 15:43:50

文章目录

  • 前言
  • 一、核心
  • 二、解决方案架构
  • 三、实现方案
    • 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.hkcw.cn/article/FXCnmVMHkK.shtml

相关文章

Linux环境搭建MCU开发环境

操作系统版本&#xff1a; ubuntu 22.04 文本编辑器&#xff1a; vscode 开发板&#xff1a; stm32f103c8t6 调试器&#xff1a; st-link 前言 步骤一&#xff1a; 安装交叉编译工具链 步骤二&#xff1a; 创建工程目录结构 步骤三&#xff1a; 调试…

VR/AR 视网膜级显示破局:10000PPI 如何终结颗粒感时代?

一、传统液晶 “纱窗效应”&#xff1a;VR 沉浸体验的最大绊脚石 当用户首次戴上 VR 头显时&#xff0c;眼前密密麻麻的像素网格往往打破沉浸感 —— 这正是传统液晶显示在近眼场景下的致命缺陷。受限于 500-600PPI 的像素密度&#xff0c;即使达到 4K 分辨率&#xff0c;等效到…

【教学类-36-10】20250531蝴蝶图案描边,最适合大小(一页1图1图、2图图案不同、2图图案相同对称)

背景说明: 之前做了动物头像扇子(描边20),并制作成一页一套图案对称两张 【教学类-36-09】20250526动物头像扇子的描边(通义万相)对称图40张,根据图片长宽,自动旋转图片,最大化图片-CSDN博客文章浏览阅读1k次,点赞37次,收藏6次。【教学类-36-09】20250526动物头像…

灌水论坛系统总体设计文档

一、实验题目 灌水论坛系统 二、实验目的 旨在通过一个相对完整且功能丰富的Web应用实例&#xff0c;全面地实践和巩固Web开发所需的各项核心技术和工程方法&#xff0c;从而提升其综合应用能力和解决实际开发问题的能力。它不仅仅是完成一个软件&#xff0c;更是一个学习、…

TK海外抢单源码/指定卡单

​ 抢单源码&#xff0c;有指定派单&#xff0c;打针&#xff0c;这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单&#xff0c;金额多少&#xff0c; 前后端开源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接静态 伪静…

印军高官为何指责83架光辉订单0交付 国产战机交付延迟

印度空军参谋长辛格在印度工业联合会举办的年度商业峰会上严厉批评本国的航空制造业,指出印度大型国防项目的落实没有如期进行,包括国产“光辉”战机在内的战斗机向空军交付均出现延迟。根据2021年与印度斯坦航空有限公司签订的价值4800亿卢比(约合404亿元人民币)的合同,印…

年轻人开始主动挂艾草了 老习俗焕发新活力

今年端午节当天,“年轻人开始主动挂艾草了”登上小红书APP热点榜首,截至晚上9点30分浏览量达到918万次。菜市场几块钱一把的野生艾草,在年轻人手中经过巧手改造,搭配菖蒲叶、玉簪叶、香樟果和铃铛,变成了身价百元的“祈福门挂”。如今,挂艾草不再只是简单的节庆习俗,而是…

Roguelike地牢:混沌系统与涌现式玩法设计

目录 Roguelike地牢:混沌系统与涌现式玩法设计引言第一章 地牢生成算法1.1 多级生成策略1.2 柏林噪声应用第二章 道具生态系统2.1 属性耦合模型2.2 道具稀有度系统第三章 敌人行为树3.1 自适应难度3.2 状态机设计第四章 永久死亡机制4.1 元进度系统4.2 遗产继承设计第五章 光照…

【数据集】基于累计分布函数匹配CDF Matching与多分辨率卡尔曼滤波MKF相结合的地表温度(2002-2020)

目录 数据概述一、输入数据二、生产流程与处理方法步骤一:生成被动微波LST数据(PMW LST)步骤二:CDF匹配提高高分辨率LST质量步骤三:多分辨率卡尔曼滤波(MKF)融合生成全时空覆盖LST三、模拟效果与实验结果四、生成空间完整全天候LST五、验证与精度评估数据下载下载方式1:…

探索Python中的Dask:高效处理大规模数据的利器

在当今数据驱动的时代&#xff0c;处理大规模数据集已成为许多领域的重要挑战。Python作为数据科学和机器学习领域的主流编程语言&#xff0c;虽然拥有NumPy和Pandas等强大的库&#xff0c;但在面对超出内存限制的大数据集时&#xff0c;这些工具往往显得力不从心。Dask作为一款…

DeepSeek 部署中的常见问题及解决方案

部署环境配置问题 硬件资源不足或兼容性问题可能导致部署失败。在部署前需要对计算资源进行全面评估&#xff1a; 硬件要求检查 CPU&#xff1a;至少4核处理器&#xff08;推荐8核以上&#xff09;&#xff0c;如Intel Xeon或AMD EPYC系列GPU&#xff08;如需&#xff09;&…

SpringBoot简单体验

1 Helloworld 打开&#xff1a;https://start.spring.io/ 选择maven配置。增加SpringWeb的依赖。 Generate之后解压&#xff0c;代码大致如下&#xff1a; hpDESKTOP-430500P:~/springboot2/demo$ tree ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── s…

[yolov11改进系列]基于yolov11引入大型分离卷积注意力模块LSKA减少计算复杂性和内存的python源码+训练源码

【LSKA介绍】 本文给大家带来一种超大核注意力机制的改进方法&#xff0c;尝试了多种改进方法。不仅速度快&#xff0c;而且还有不同程度的提升了精度&#xff01; 论文&#xff1a;《LSKA&#xff08;大可分离核注意力&#xff09;&#xff1a;重新思考CNN大核注意力设计》 h…

AI编程在BOSS项目的实践经验分享

前言 在人工智能技术革新浪潮的推动下&#xff0c;智能编程助手正以前所未有的速度重塑开发领域。这些基于AI的代码辅助工具通过智能提示生成、实时错误检测和自动化重构等功能&#xff0c;显著提升了软件工程的全流程效率。无论是初入行业的开发者还是资深程序员&#xff0c;…

菜鸟之路Day36一一Web开发综合案例(部门管理)

菜鸟之路Day36一一Web开发综合案例&#xff08;部门管理&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.5.28 文章目录 菜鸟之路Day36一一Web开发综合案例&#xff08;部门管理&#xff09;一.环境搭建二.开发规范三.部门管理3.1查询3.2删除3.3新增3.3修改根据id来…

一周学会Pandas2之Python数据处理与分析-Pandas2数据合并与对比-df.compare():差异高亮

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili df.compare()&#xff1a;差异高亮 df.compare() 是 pandas 中用于 高效比较两个 DataFrame 差异 的方法&#xff0…

uniapp安卓App自定义相机(身份证相机)

效果图&#xff1a; 实现思路&#xff1a; 本人也是第一次做app的自定义相机功能&#xff0c;找了相关文章后&#xff0c;发现uniapp自带的相机组件是不能实现在app中自定义相机的功能&#xff0c;因为不支持。按照前辈们的思路&#xff0c;是使用uniapp中的live-pusher直播组…

【软件安装】非华为手机安装华为电脑管家(14.0.5.8 C233)(附带安装包下载地址)

前言 华为电脑管家是一款专为华为电脑用户设计的综合管理软件&#xff0c;提供了多种实用功能&#xff0c;旨在优化电脑性能并提升用户体验。其拥有以下特色功能&#xff1a; 互传功能&#xff1a; 快速传输&#xff1a;华为电脑管家支持与华为手机之间的快速文件传输。用户可…

明基RD280U编程显示器深度测评:码农的「第二块键盘」竟然会发光?

文章目录 前言一、开箱篇&#xff1a;当理工男遇到「俄罗斯套娃式包装」二、外观篇&#xff1a;深空灰的「代码容器」1. 桌面变形记2. 保护肩颈的人体工学设计 三、显示篇&#xff1a;给代码做「光子嫩肤」1. 28寸超大大屏 3:2屏比 4K超清2.专业编程模式&#xff0c;让代码一…

一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验

没想到作为使用电脑多年的老司机也会电脑中病毒&#xff0c;周末玩电脑的时候突然电脑很卡&#xff0c;然后自动重启&#xff0c;奇怪&#xff0c;之前没出现这个情况。 重启后电脑开机等了几十秒&#xff0c;打开任务管理器查看开机进程&#xff0c;果然发现有个Synaptics Po…