SignalR简介及实践指南

news/2024/5/14 20:01:36/文章来源:https://blog.csdn.net/qq_32109957/article/details/128086979

SigalR简介

ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。

适合 SignalR 的候选项:

  • 需要从服务器进行高频率更新的应用。 示例包括游戏、社交网络、投票、拍卖、地图和 GPS 应用。
  • 仪表板和监视应用。 示例包括公司仪表板、即时销售更新或旅行警报。
  • 协作应用。 协作应用的示例包括白板应用和团队会议软件。
  • 需要通知的应用。 社交网络、电子邮件、聊天、游戏、旅行警报和很多其他应用都需使用通知。

SignalR 提供用于创建服务器到客户​端远程过程调用 (RPC) 的 API。 RPC 从服务器端 .NET Core 代码调用客户端上的函数。提供多个受支持的平台​,其中每个平台都有各自的客户端 SDK。 因此,RPC 调用所调用的编程语言有所不同。

以下是 ASP.NET Core SignalR 的一些功能:

  • 自动处理连接管理。
  • 同时向所有连接的客户端发送消息。 例如聊天室。
  • 向特定客户端或客户端组发送消息。
  • 对其进行缩放,以处理不断增加的流量。

(SignalR 架图)

SignalR并不只是对WebSocket的封装,它支持多种服务器推送的实现方式,包括WebSocket、服务器发送事件(server-sent events)和长轮询。SignalR的JavaScript客户端会先尝试用WebSocket连接服务器;如果失败了,它再用服务器发送事件方式连接服务器;如果又失败了,它再用长轮询方式连接服务器。因此SignalR会自适应复杂的客户端、网络、服务器环境来支持服务器端推送的实现。

SignalR的JavaScript客户端和服务器之间会首先进行一次“协商”,确定采用什么协议进行通信,这个协商过程我们有时候也称之为“握手”。协商完成后,客户端和服务器之间再建立WebSocket通信。在协商的时候,服务器端就会为这个客户端后面的连接创建一些上下文信息,在建立WebSocket连接的时候就会使用服务器端创建的那些上下文信息,也就是说服务器端会在协商请求和WebSocket请求之间保持状态。在单台服务器下,这样处理没问题,但是如果在多台服务器组成的集群中,这样处理就会带来问题。比如,协商请求被服务器A处理,而接下来的WebSocket请求却被服务器B处理,由于服务器A中没有这个客户端在协商阶段的上下文信息,因此WebSocket请求处理失败了。

SignalR集群在环境中的问题

解决SignalR在多台服务器组成的集群中的这个问题,有两个方法:黏性会话和禁用协商。黏性会话(sticky session)指的是,我们对负载均衡服务器进行配置,以便把来自同一个客户端的请求都转发给同一台服务器。这样就避免了协商请求和WebSocket请求由不同服务器处理的问题。不过,由于网络协议的特点,负载均衡服务器只能根据网络请求的客户端IP地址来判断客户端的同一性,也就是只要网络请求的客户端IP地址一样,我们就认为是同一个客户端。我们知道,在很多网络中,很多的联网设备共享同一个公网IP地址,因此来自这些网络中的请求都会被认为来自同一个客户端而被转发到同一台服务器,特别是有的CDN环境会丢弃原始客户端的IP地址信息。这样就会导致来自客户端的请求无法被平均分配到服务器集群中。而且,在网站面对持续增长的、长时间连接的客户端请求(比如网络直播中的公屏聊天界面)时,也会造成请求无法均匀分布在集群服务器中的问题。

禁用协商的解决策略很简单,就是SignalR客户端不和服务器端进行网络协议的协商,而直接向服务器发出WebSocket请求。由于没有协商过程,因此也就没有两次请求状态保持的问题,而且WebSocket连接一旦建立后,在客户端和服务器端直接就建立了持续的网络连接通道,在WebSocket连接中的后续往返WebSocket通信都由同一台服务器来处理。这种方法的缺点就是对于不支持WebSocket的浏览器无法降级到服务器发送事件或长轮询的实现方式,不过这不是什么大问题,因为现在主流浏览器都支持WebSocket。在移动端,只有Android 4.0以下内置浏览器才不支持WebSocket,而这样老版本的设备在市场上已经很难见到了。在桌面端,只有IE9及以下浏览器才不支持WebSocket,不过SignalR的JavaScript客户端已经不支持IE全线产品了,因此如果读者的网站需要兼容IE,请不要使用SignalR。

在分布式环境中,还有其他问题需要解决。假设聊天室程序被部署在两台服务器上,客户端1、2连接到了服务器A上的ChatRoomHub,而客户端3、4连接到了服务器B上的ChatRoomHub,那么在客户端1发送群聊消息的时候,只有客户端1、2能够收到,而客户端3、4收不到;在客户端3发送群聊消息的时候,只有客户端3、4能够收到,而客户端1、2收不到。因为这两台服务器之间的ChatRoomHub没有通信。为了解决这个问题,我们可以让多台服务器上的集线器连接到一个消息队列中,通过这个消息队列完成跨服务器的消息投递。微软官方提供了用Redis服务器来解决SignalR部署在分布式环境中数据同步的方案—Redis backplane,其使用方法如下。

SignalR实践指南

Hub类的生命周期是瞬态的,也就是每次调用集线器的时候都会创建一个新的Hub类实例,因此我们不要在Hub类中通过属性、成员变量等方式保存状态。如果服务器的压力比较大,建议把ASP.NET Core程序和SignalR服务器端部署到不同的服务器上,以免它们互相干扰。如果需要在客户端连接到集线器或者在集线器断开的时候执行代码,我们可以覆盖Hub类中的OnConnectedAsync和OnDisconnectedAsync方法。

SignalR除了提供了供浏览器使用的JavaScript客户端,官方还提供了.NET、Java客户端,开源社区还提供了C++、Swift等语言的客户端,因此我们也可以编写WPF、WinForm、Android、iOS等程序来连接服务器端。SignalR的JavaScript客户端不支持IE,因此如果读者的项目需要兼容IE,请不要使用SignalR。ASP.NET Core把SignalR底层的WebSocket封装为了单独的组件,我们可以使用这个组件来编写原生的WebSocket程序,这样我们就可以在IE10、IE11等不被SignalR支持的浏览器中进行服务器消息推送的开发。因为Windows 10、Windows 11等是桌面操作系统,这些桌面操作系统上的IIS有10个并发连接的限制,如果我们使用这些操作系统测试SignalR,就会发现SignalR的服务器端并发能力非常差,所以这些桌面操作系统只能作为开发机使用。在生产环境中,请使用Windows Server系列操作系统或者使用Linux。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_38404.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易观千帆 | 2022年10月银行APP月活跃用户规模盘点

易观分析:易观千帆数据显示,10月手机银行服务应用活跃人数52285.79万,环比下降3.52%。手机银行服务应用月活规模经历了连续5个月的持续增长后,10月出现下降。 10月城商行手机银行服务应用活跃人数3565.56万,环比下降2…

UNIAPP实战项目笔记46 订单确认页面的布局

UNIAPP实战项目笔记46 订单确认页面的布局 实际案例图片 订单页面 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 代码 confirm-order.vue部分 confirm-order.vue 确认订单页面布局和渲染 flex 样式布局 <template>…

字符串5:剑指Offer58-II.左旋转字符串

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;344. 反转字符串 题目&#xff1a; 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个…

衡师11月月赛web题目wp

目录 1.丢三落四的学姐 2.wep&#xff1f;Pwn&#xff01;&#xff01;&#xff01; 这题web部分是buuctf中的DASCTF X GFCTF 2022十月挑战赛&#xff01;的原题 1.丢三落四的学姐 访问题目位置&#xff0c;很明显的phpstudy搭建的痕迹 访问一下经常信息泄露的几个文件&…

Baklib|知识库应用场景:制作员工培训手册

持续的专业发展对于想要加入、保留和提升员工的组织来说是必不可少的。为了确保员工总是能从学习能力中受益&#xff0c;您需要考虑创建培训手册&#xff0c;使员工能够胜任并保持他们的工作能力。 在过去&#xff0c;您可能认为培训手册是一本厚重的册子&#xff0c;充满了密…

一文彻底搞懂Mysql索引优化

专属小彩蛋&#xff1a;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff08;前言 - 床长人工智能教程&#xff09; 目录 一、索引介绍 二、性能分析 三、查询优化 一、索引介绍…

Oracle中ALTER TABLE的五种用法(三)

首发微信公众号&#xff1a;SQL数据库运维 原文链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzI1NTQyNzg3MQ&mid2247485212&idx1&sn450e9e94fa709b5eeff0de371c62072b&chksmea37536cdd40da7a94e165ce4b4c6e70fb1360d51bed4b3566eee438b587fa231315d0a5a…

通俗易懂的java设计模式(1)-单例模式

什么是单例模式&#xff1f; 单例模式是java中最简单的一种设计模式 需要注意的问题&#xff1a; 1.单例类有且只能有一个实例 2.单例类必须自己创建出这个实例&#xff0c;并提供给外界 那么如何自己创建实例而不让外界创建呢&#xff1f;很简单&#xff0c;我们将无参的构造函…

传输线理论基础01——相关定义、信号速率、分布参数与电报方程

前言一直以来都对高频信号、信号完整性、传输线、分布参数这些概念似懂非懂&#xff0c;上学时没学过相关课程&#xff0c;这导致我对高频电路和PCB理解较差&#xff0c;这里新开一个专栏&#xff0c;补齐这方面知识。 一. 传输线相关定义1.1 传输线定义 传输线指的是传输信号…

【Hack The Box】Linux练习-- Seventeen

HTB 学习笔记 【Hack The Box】Linux练习-- Seventeen &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f…

【数据去噪】SG-多项式平滑算法

文章目录一、简介二、原理5点3次多项式平滑三、代码1. 3点线性平滑2. 5点线性平滑3. 5点2次线性平滑4. 5点3次线性平滑5. 7点线性平滑6. 7点2次线性平滑一、简介 在处理工业数据的时候&#xff0c;工业数据有数据颗粒细&#xff0c;噪声大&#xff0c;量大&#xff0c;随着测量…

拿捏Fiddler抓包教程(10)-Fiddler如何设置捕获Firefox浏览器的Https会话

1.简介 经过上一篇对Fiddler的配置后&#xff0c;绝大多数的Https的会话&#xff0c;我们可以成功捕获抓取到&#xff0c;但是有些版本的Firefox浏览器仍然是捕获不到其的Https会话&#xff0c;需要我们更进一步的配置才能捕获到会话进行抓包。 2.宏哥环境 1.宏哥的环境是Win…

【Python】四、程序顺序和分支控制结构

文章目录实验目的一、赋值语句应用练习二、if- else分支结构三、多分支选择结构四、选择嵌套五、编程实现百分制换成五级制(优,良,中,及格,不及格)1.设计思路2.设计算法3.参考代码4.实验截图实验目的 掌握顺序和分支结构&#xff1b;培养学生动手查阅资料能力和解决实际问题的能…

CAD特殊符号,你不一定会

在CAD软件中&#xff0c;有时候会输入一些特殊的符号。比如在标明高低差的时候会输入“”号&#xff0c;在标明管子或者钢筋的直径为输入直径符号“”&#xff0c;为了标明角度值需要输入符号“”&#xff0c;那么这些符号怎么快速的绘制出来呢&#xff1f;我们一起用CAD梦想画…

初识计算机网络

目录 网络的发展 重新看待计算机结构 大型存储平台 认识 "协议" 网络和OS之间的关系 初识网络协议 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 局域网通信的原理 如果进行跨网络传输 网络通信里面的基本轮廓 数据包封装和分用…

QFile(文件)

QFile QFile提供一个用于读/写的接口&#xff0c;是一个可以用来读/写二进制文件的Qt资源的I/O设备&#xff0c;QFile可以单独使用&#xff0c;一般配合QTextStream或QDataStream 输入文件路径时最好使用"/"作为分隔符 构造函数&#xff1a; 常用的函数&#xff1a;…

Terraform 华为云最佳实践

目录划分如下&#xff1a;首先是环境&#xff0c;分为网络和service。global是全局的配置&#xff0c;也就是backend的配置&#xff0c;这次使用s3的存储作为backend的存储。最后就是模块做了一些封装。 在global里面的backend里面的main.tf去创建s3的存储。华为云支持s3存储&a…

四、nginx负载均衡[轮询]

一、负载均衡 解释&#xff1a;负载均衡分为两部分&#xff08;应用集群和负载均衡器&#xff09;。应用集群&#xff1a;将同一应用部署到多台机器上&#xff0c;组成处理集群&#xff0c;接收负载均衡设备分发的请求&#xff0c;进行处理并返回响应的数据。负载均衡器:将用户…

【分析笔记】全志 i2c-sunxi.c 控制器驱动分析

分析平台&#xff1a;全志 A64 内核版本&#xff1a;Linux 4.9 数据手册&#xff1a;Allwinner_A64_User_Manual_V1.1.pdf (whycan.com) 驱动框架 I2C 设备驱动 作为方案应用来说&#xff0c;我们是最经常要动的地方&#xff0c;这一层主要与具体的芯片功能强关联&#xff0c…

Vue2常见的缺陷与Vue3带来的新特性

文章目录一、Vue2的常见缺陷1.首先从开发维护的角度来看2.从社区的二次开发难度来说3.从我们普通开发者的角度来说二、 Vue3的新特性1. RFC机制2. 响应式系统3. 自定义渲染器3.全部模块使用TS重构4. Composition API5. Vite一、Vue2的常见缺陷 先看一看 Vue 2。从下图你能看到…