在.NET Core中避开SingalR连接数限制
多数情况下,客户端和服务端的关系就像一对朋友,通过请求–响应方式你来我往,客户端无论是刷新页面还是发送请求,服务端有求必应。SignalR让客户端和服务端之间建立了全双工通讯,两者又似乎成了家人,你中有我我中有你,客户端可以调用服务端的方法,反之亦然。于是我们在股票金融、物联网设备、多人协作等需要实时显示数据的场景中看到了SignalR的身影。
本周,在"青岛微软技术交流"群里,Darren提出了一个SinglaR
连接数受限的问题,经过大家的群(七)策(嘴)群(八)力(舌),Darren最终在项目中避开了连接数限制问题,取得了很好的实时效果。本篇侧重于对整个过程的复盘,不涉及SignalR
的基本面。
在Darren的项目中,设备的实时数据指向到了MVC中的一个控制器(DataReceiverController
)方法,局域网内的设备每隔几秒向该控制器方法发送实时数据一次,在其中进行处理并按设备号(设备号具备唯一性)异步保存到Redis
缓存,最终在视图页中展示某个区域的、比如10台设备的实时数据。
首先的一个思路是:当打开某个区域内包含10台设备的视图页,让它每隔几秒就到Hub
取数据,而Hub
负责把Redis
缓冲中的各个设备的数据收集上来转换成视图页所需要的格式。大致如下:
这样做能实现实时性,但是存在的问题是:由于每个设备中包含了多路数据,当设备中的某个线路数据发生变化,视图页需较长的时间才能反应过来。
代码方面,在依赖倒置容器、请求管道中的配置大致如下:
以上的MyHub
是SignalR
中最核心的部分。
有了Hub
,视图页就每隔几秒向Hub
请求一次。
以上,视图页每次向Hub
请求数据,Hub
就会调用视图页的broadcast
方法把数据加载到页面。
既然视图页加载10台设备的所有路数据实时反应不够理想,如果分而治之会怎样呢?如果在视图页配上10个iframe
,通过其src
属性加载各个设备的视图页呢?大致如下:
此时的Hub
需要根据设备号到缓存取数据再交给视图页。
运行下来会报错:cannot send data if the connection is not in the 'Connected' state。
原因在于:
每个客户端将同时具有大约6个连接的HTTP连接限制。当SignalR
使用长轮询或服务器发送事件时,很快就会达到限制。甚至WebSockets
也限制了大约50个连接。
于是Darren把问题抛给了群里。有说可以通过Stream
的方式来做,也有从设备通讯协议的角度给出建议。最后,"独火"建议只把数据变化交给客户端,Darren尝试了这种方式。
SignalR提供了IHubContext<T>
接口,可以把它注入到控制器,每当设备数据过来,把现有数据和缓存中的数据进行比对,如果有变化直接使用IHubContext<T>
调用视图页方法。
这样一来,在DataReceiverController
中获取到实时数据,与缓存数据进行比对,只把变化交给视图页。用这种方式实时反应明显提升,并且避开了SignalR
连接数限制的问题。
以上 .NET Core的运行时是2.0,各个运行时下使用的方式略有不同。
在.NET Core中避开SingalR连接数限制相关推荐
- 如何在 ASP.Net Core 中使用 SignalR
SignalR for ASP.Net Core 是 SignalR 的浴火重生版,允许你在 ASP.Net Core 中实现实时通讯,这里的 实时 意味着双方都能快速的感知对方发来的消息,比如:一旦 ...
- ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡
本系列相关文章: <ASP.NET Core中Ocelot的使用:API网关的应用> <ASP.NET Core中Ocelot的使用:基于Spring Clound Netflix ...
- 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题
在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关 ...
- 在.NET Core中处理一个接口多个不同实现的依赖注入问题
前言 近段时间在准备公司的技术分享,所以这段时间将大部分时间放在准备分享内容上去了.博客也就停了一下下. 在.NET Core中处理依赖注入问题时,往往是定义好了一个操作规范的接口,会有N多个基于不同 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET S ...
- .net core 中并发请求发送HttpWebRequest的坑
在framework中,大量并发 HttpWebRequest 需要设置一个最大连接数 ServicePointManager.DefaultConnectionLimit = 200; 但是在.ne ...
- .net core 中的[FromBody]
一.针对.net core中post类型的api注意的地方(前提是Controller上加[ApiController]特性).默认是这个. 1.如果客户端Content-Type是applicati ...
- 如何使用C#在ASP.NET Core中轻松实现QRCoder
by Yogi 由瑜伽士 如何使用C#在ASP.NET Core中轻松实现QRCoder (How to easily implement QRCoder in ASP.NET Core using ...
- 使用Novell.Directory.Ldap.NETStandard在.NET Core中验证AD域账号
Novell.Directory.Ldap.NETStandard是一个在.NET Core中,既支持Windows平台,又支持Linux平台,进行Windows AD域操作的Nuget包. 首先我们 ...
最新文章
- 我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!
- Linux headtail命令
- Gym - 101986F Pizza Delivery(最短路+DAG必经边)
- HTML5 Audio(音频)
- 482. 密钥格式化
- 《游戏行业DDoS攻击解决方案》重磅发布
- mysql 复制方式_MySQL复制方法
- Each interface on the back of the fuselage
- 【图像去噪】基于matlab全变分算法图像去噪【含Matlab源码 1324期】
- 【应用软件】用jpg+swf制作gif动感小图(附带AVI转gif技巧)
- CTF-Tools 一款CTF古典密码加解密工具
- 用Firefox看CHM电子书
- WINVNC源码分析(四)
- CSR蓝牙开发资源大全(软件代码资料)
- 我的第一份CUDA代码
- 3.9使用ValidationSummary控件
- 如何使用股票行情软件看股票
- 网站推广最实用不过的七种方法
- 车载开发之 Hicar carLife carPlay
- 如何将dedecms转Eyoucms程序呢?告别织梦商业授权烦恼教程
热门文章
- mac 启动android 模拟器,weex 启动 android 模拟器(mac环境)
- python按内容分割txt文件_Python实现逐行分割大txt文件示例详解
- 节操播放器——视频充满布局、监听播放结束(循环播放)、隐藏进度条等
- ssm+jsp计算机毕业设计宠物狗网店管理系统y1urm(程序+LW+源码+远程部署)
- 软件开发的打怪升级攻略
- el-table单元格换行显示,超出部分省略号
- CardView 简介和使用
- 计算机教育学论文,计算机教育学论文大纲范本模板 计算机教育学论文大纲怎么写...
- 阳光城:规模快车道上的速度与理性
- 逍遥自在学C语言 | 指针函数与函数指针