一、SiganlR 使用的协议类型

  • 1.websocket即时通讯协议
  • 2.Server-Sent Events(SSE)服务器事件
  • 3.longpolling 长轮询。

如果客户端开启协商,会按顺序选择可兼容的协议。(默认开启协议协商)

如果客户端禁用协商,只能websocket协议。

二、连接过程

  • 客户端未禁用协商

    • 1.客户端向服务器发http请求,询问服务器支持什么协议。

      服务端返回支持的协议类型,并分配ConnectionId。(http 协商请求)
    • 2.客户端确认协议后发送 websocket 请求,建立连接。(客户端会按顺序选择可兼容的协议)
  • 客户端禁用协商
    • 客户端直接发送 websocket 请求,建立连接。
    //客户端建立signalr连接时,指定配置参数,禁用协商。
    const options = {
    skipNegotiation: true,//是否跳过协商过程
    transport: signalR.HttpTransportType.WebSockets,//直接指定使用websocket协议
    };
    connection = new signalR.HubConnectionBuilder()
    .withUrl("https://localhost:7002/Hubs/ChatRoomHub",options)
    .withAutomaticReconnect() //自动重连
    .build();

三、身份认证

  • websocket协议 无请求报文头headers,token只能放 QueryString 中,一般参数名定为 access_token。
  • 在 Hub中引入身份认证服务,Hub OnConnectedAsync()中,即建立连接时,通过身份认证服务解析token是否合法并拿到用户信息。

四、分布式部署问题

问题1. 多节点环境,客户端协商过程,可能请求到不同服务器。

如果有AB两个服务器负载,在协商过程时

客户端第一次http请求A,A服务器记录了客户端连接信息上下文。

客户端第二次ws连接发送到B服务器,而B服务器没有客户端连接信息上下文,就出错了。

方式1. 粘性会话

网关服务器 或 负载均衡服务器 进行配置,把来自同一个客户端的请求都转发给同一台服务器。

  • 优点:兼容性最好,客户端按兼容性依次选择协议
  • 缺点:公网ip没办法平均分配,很难控制。
方式2. 禁用协商

客户端连接时设置禁用协商,连接时仅一次ws请求。

  • 缺点:只能适用于兼容websocket的浏览器 只能使用websocket协议,无法使用 sse 和 longpolling

问题2. 多节点环境,消息不能跨服务器连接发送。

A服务器向全部连接发消息,只能发送到连接A服务器的客户端,不能发送给连接到B服务器的客户端。

  • 解决办法:引入 Microsoft.AspNetCore.SignalR.StackExchangeRedis 包,注入分布式SignalR服务到DI中。

    作用:在多个服务器实例之间共享消息和连接状态。确保跨服务器实例的连接同步和消息传递。
     services.AddSignalR(o =>
    {
    o.EnableDetailedErrors = true;//详细异常信息
    o.HandshakeTimeout = TimeSpan.FromSeconds(30);//握手超时时间
    }).AddStackExchangeRedis("{redis连接字符串}", opt =>
    {
    opt.Configuration.ChannelPrefix = "{RedisKey前缀}";
    });//分布式 SignalR 消息

问题3. 在后台任务中使用Hub推送消息。

  • 1.建立连接,从token中拿到用户信息。(分布式环境,多节点负载时,更新缓存需要加锁)

    • 缓存: 用户id - [连接id集合]
    • 缓存: 连接id - 用户id
  • 2.断开连接,从缓存中移除 当前连接id。(分布式环境,多节点负载时,更新缓存需要加锁)
  • 3.后台任务
    • 注入分布式SignalR服务
    • 注入Hub服务
    • 业务中拿到要接收消息的 用户id集合
    • 从缓存中找到对应的 全部连接id
    • 调Hub向连接id推送SignalR消息

.Net 6 SignalR 实际业务开发中遇到的问题及解决办法的更多相关文章

  1. highcharts插件使用总结和开发中遇到的问题及解决办法

    这里使用的highchart是2014-01-09从官网下载的版本,版本号是3.0.8, 当过了几天后,发现版本号变成了3.0.9,不由得的感叹highchart的版本更新之快. 在jsp中使用hig ...

  2. H5开发中遇到的问题及解决办法

    记不得什么时候进行H5开发的学习了,只知道是从2016年8月1日开始修复Bug,计划每天把学到的东西以及遇到问题时候的解决方案都记录下来,希望自己能够坚持下去,每天积累一点,希望有所进步吧. 1.Th ...

  3. java开发中遇到的问题及解决方法(持续更新)

    摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...

  4. 关于jFinal开发中遇到的中文乱码问题解决办法

    关于jFinal开发中遇到的中文乱码问题解决办法 设置tomcat的编码,修改 <Connector port="8080" protocol="HTTP/1.1& ...

  5. iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】

    在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...

  6. iOS cocopods安装使用和安装过程中遇到的问题及解决办法

    在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...

  7. 在vue中使用 layui框架中的form.render()无效解决办法

    下面简单介绍在vue中使用 layui框架中的form.render()无效解决办法. 原文地址:小时刻个人技术博客 > http://small.aiweimeng.top/index.php ...

  8. Android开发:ScrollView嵌套GridView的解决办法

    Android开发:ScrollView嵌套GridView的解决办法   前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便 ...

  9. MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)

    问题描述:新安装的myeclipse 2014,代码编辑器中汉字很小看不清 解决办法:调整字体即可.通过菜单Windows——Preferences,输入font过滤选择Colors and Font ...

  10. 虚拟机中不能连接usb设备解决办法

    虚拟机中不能连接usb设备解决办法 1.点击开始->运行,在对话框中输入"services.msc",确定,打开windows服务管理器.2.在服务列表中选中"VM ...

随机推荐

  1. C语言指针知识总结

    指针 定义 指针是一个变量,存储另一个变量的内存地址,它允许直接访问和操作内存中的数据,使得程序能够以更灵活和高效的方式处理数据和内存. 获取变量地址:使用取地址符 &. 访问地址上的数据:使 ...

  2. Python学习的个人笔记

    python基础知识 目录: Python基础语法: (1)打印出hello world (2)注释 (3)数据类型 (4)运算 (5)输入 (6)输出 (7)序列 (8)相等比较 (9)选择 (10 ...

  3. 5、SpringMVC之域对象共享数据

    5.1.域对象简介 请求域(request):一次请求范围内有效 会话域(session):一次会话范围内有效 应用域(application):整个应用范围内有效 5.2.环境搭建 5.2.1.右击 ...

  4. 【TypeScript】01 基础入门

    前提:使用TypeScript你需要安装NodeJS支持 然后安装TypeScript: npm intsall -g typescript 安装完成后查看版本号: tsc -v 新建一个TypeSc ...

  5. Regardless of the outcome of the Russia-Ukraine war, how can Ukraine avoid paying the weapon fees to the United States after the war?

    According to the agreement between the Ukrainian government and the United States, regardless of the ...

  6. 使用浪潮AI计算平台之分布式计算(Tensorflow框架下 PS/Worker模式下的异步计算)

    虽然Tensorflow一直都是支持分布式计算的,但是由于只有一台电脑,一个GPU,所以别说分布式的tensorflow的使用了,就是单机多卡都是没有使用过的,由于后来可以有机会使用这个浪潮的AI计算 ...

  7. 说说"铁马冰河"事件

    地址: https://baike.baidu.com/item/%E9%93%81%E9%A9%AC%E5%86%B0%E6%B2%B3/60313943?fr=aladdin 其实也没有什么好说的 ...

  8. springboot中统一日志输出logback

    1.背景 为了便于分析和记录系统的运行,一个系统输出其运行的关键日志是非常必要的 比如输出:请求参数.请求url.请求方式.执行的sql.重要操作的日志.响应结果等 而这些日志中,大部分不需要我们手动 ...

  9. jenkins集成findBugs并生成报告 转

    公司使用jenkins来作为持续构建工具,由于要进行自动化构建.编译.代码走查.打包.今天介绍下 jenkins集成findbugs的经验. 1.首先进入jenkins插件管理页面,下载途中的find ...

  10. ARM指令和Thumb指令的区别

    ARM处理器的工作状态 https://blog.csdn.net/itismine/article/details/4753701?depth_1-utm_source=distribute.pc_ ...