SignalR简介及实践指南

news2025/1/18 17:03:39

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.coloradmin.cn/o/44426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】No.102. Binary Tree Level Order Traversal -- Java Version

题目链接:https://leetcode.com/problems/binary-tree-level-order-traversal/ 1. 题目介绍(Binary Tree Level Order Traversal) Given the root of a binary tree, return the level order traversal of its nodes’ values. (i.e., from …

React Redux 中触发异步副作用

React Redux 中触发异步副作用 一些基本的配置(这里使用 toolkit)可以在这篇笔记中找到:react-redux 使用小结,这里不多赘述。 触发副作用主流的操作方式有两种: 组件内操作 适合只会在当前组件中触发的 API 操作 写…

企业数仓DQC数据质量管理实践篇

一.数据质量管理背景 以大数据平台的核心理念是构建于业务之上,用数据为业务创造价值。大数据平台、数据仓库的搭建之初,优先满足业务的使用需求,数据质量往往是被忽视的一环。但随着业务的逐渐稳定,数据质量越来越被人们所重视。…

2.1.3 运算放大器的参数以及选型、静态、交流技术指标

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

基于小脑模型神经网络轨迹跟踪matlab程序

1 CMAC概述 小脑模型神经网络(Cerebellar Model Articulation Controller,CMAC)是一种表达复杂非线性函数的表格查询型自适应神经网络,该网络可通过学习算法改变表格的内容,具有信息分类 存储的能力。 CMAC把系统的输入状态作为一个指针,把相…

Oracle-Autoupgrade方式升级19c

前言: Autoupgrade是Oracle 推出的自动升级工具,通过该工具可以将数据库升级为Oracle12.2之后的版本,工具支持升级前的检查、升级问题修复、一键式自动升级以及升级后的问题修复,极大的简化数据库的升级步骤。 支持的目标升级版本: Oracle D…

用 Java 实现爬虫 (爬取本地html中的人物信息并可视化人物关系)

目录 爬虫简介 常用的工具框架 selenium Jsoup Jsoup介绍 Jsoup的主要功能如下: HTML 相关知识 通过Jsoup元素获取 案例 爬取本地html中的角色信息 HtmlParseUtil 可以利用relation-graph 将人物关系可视化 使用爬虫要注意 查看网站的爬虫协议 爬虫简介…

面试:ANR原因及排查

ANR原因 1、CPU满负荷,I/O阻塞 2、内存不足,系统分配给一个应用的内存是有上限的,长期处于内存紧张,会导致频繁内存交换,进而导致应用的一些操作超时。自己内存泄漏或者其他应用占用的大量内存 3、四大组件ANR 4、…

字符串压缩(一)之ZSTD

一、zstd压缩与解压 ZSTD_compress属于ZSTD的Simple API范畴,只有压缩级别可以设置。 ZSTD_compress函数原型如下: size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel) ZSTD_decompress函数原…

Mysql replace into

CREATE TABLE t (id int(11) NOT NULL AUTO_INCREMENT,age int(11) DEFAULT NULL,msg varchar(10) DEFAULT NULL,PRIMARY KEY (id),UNIQUE KEY uniq_age (age) ) ENGINEInnoDB DEFAULT CHARSETutf8;insert into t (age, msg) values (1,aaa),(2,bbb),(3,ccc);id 为自增主键、ag…

「重学JS」你真的懂数据类型吗?

前言 学习了这么久前端,发现自己对于基础知识的掌握并没有那么通透,于是打算重新学一遍JS,引用经济学的一句话:JS基础决定能力高度🤦🏻 基础很重要,只有基础好才会很少出 bug,大多数…

aws cloudformation 理解常见资源的部署和使用

参考 cfn101-workshopaws cli cloudformation cloudformation是aws的iac工具,以下简称cfn 环境搭建——cfn命令行工具 创建堆栈 aws cloudformation create-stack --stack-name testtemp \--template-body file://testtemp.yaml# --parameters ParameterKeyKey…

二叉树的循环问题

目录 一、二叉树的完全性检验 二、前序遍历的非递归写法 三、中序遍历的非递归写法 四、后序遍历的非递归写法 一、二叉树的完全性检验 给定一个二叉树的 root ,确定它是否是一个 完全二叉树 。 在一个 完全二叉树 中,除了最后一个关卡外&#xff0c…

Vue脚手架

脚手架 安装步骤 全局安装vue/cli npm install -g vue/cli 安装之后使用不了vue的命令,查看nodejs文件发现我把vue装在了node_globalnpm这个文件夹中。 解决方法:新增一条path指向该文件夹 切换到你要创建的目录创建脚手架 vue create 项目名称 根据…

[附源码]Python计算机毕业设计Django保护濒危动物公益网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【Hack The Box】linux练习-- Talkative

HTB 学习笔记 【Hack The Box】linux练习-- Talkative 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 &#x…

初始数据结构

目录 1. 集合的框架 集合框架的重要性 数据结构的介绍 算法的介绍 容器背后对应的数据结构 2. 时间复杂度和空间复杂度 算法效率 时间复杂度 时间复杂度的概念 大O的渐进表示法 常见的时间复杂度的计算 空间复杂度 空间复杂度的概念 从本章开始又要开始新的篇章&a…

[附源码]Python计算机毕业设计Django班级事务管理论文2022

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

k8s上部署Harbor通过Nginx-Ingress域名访问

目录 1、k8s集群环境,通过kubesphere安装部署。 1.1 集群基本信息 1.2 集群节点信息 2、安装Harbor 2.1、使用Helm添加Harbor仓库 2.2 、通过openssl生成证书 2.3、 创建secret 2.4、 创建nfs存储目录 2.5、 创建pv 2.6、创建pvc 2.7、values.yaml配置文件 2.…

3-UI自动化-八大元素定位,xpath定位方式和相关的常问面试题

3-UI自动化-八大元素定位,xpath定位方式和相关的常问面试题八大元素定位八大元素定位的使用通过xpath定位xpath语法1. xpath逻辑运算定位2. 层级条件定位3. 索引定位4. 文本定位text()WebElement对象WebElement对象常用属性WebElement对象常用方法find_element()和 …