Signal R - 一个实时应用程序






4.65/5 (17投票s)
Signal R 基础。
引言
实时 (RT) 应用程序
实时应用程序即时且持续地提供信息。应用程序的效率主要取决于其对错过的时间要求的容错能力。在实时应用程序中,所需的响应时间是通过定制硬件和软件组合实现的,可能没有-或者只有非常薄的操作系统层。由于它们持续运行,需要对其性能指标进行密切分析。
- 视频会议应用程序
- VoIP(互联网协议语音)
- 在线游戏
- 社区存储解决方案
- 一些电子商务交易
- 聊天
- 即时消息(IM)
- 当前活跃访客,当前登录用户
- 朋友上线或下线时
- 有人点赞或评论状态时
- 向订阅用户发送事件通知
- 有多少人正在积极玩某个游戏,观看在线网络研讨会/活动等
- 迄今为止的总交易量、购买量、展示量、消息量、点击量等等
软实时 vs 硬实时
特点 |
软实时 |
硬实时 |
失败/延迟时 |
应用程序可以继续运行,用户虽然不满意,但仍可以使用它。 |
必须严格满足实时时序要求,因为延迟的结果可能是灾难性的。 |
性能 |
不可预测的性能得到用户的容忍 |
不可预测的性能影响响应时间要求,对应用程序影响巨大 |
示例 |
应用程序对鼠标点击响应超过0.1秒。 |
控制飞机方向舵的应用程序 |
交付百分比 |
至少99.9%的响应应在特定的实时时间内交付 |
99.999%的响应应在特定的实时时间内交付 |
使用 SignalR 进行实时网络应用程序开发
什么是 SignalR
它有什么作用?
- 通过 HTTP 连接,将内容从服务器推送到客户端 RPC。
- 它是一个连接抽象。它给人的印象是在一个永久开放的持久连接上工作。它不是可靠的消息传递。
- 它通过消息总线发送每条消息。
- 它支持 CORS-跨源资源共享或 JSONP-带填充的 JSON(在 Web 浏览器中运行的 JavaScript 程序用于从不同域的服务器请求数据的一种通信技术)
如何测量和监控
- 性能计数器提供自上次应用程序池或服务器重启以来的事件数量。
- 连接指标、消息指标、消息总线指标、错误指标、横向扩展指标
SignalR 概述

它主要分为以下四个领域。
- Hub
- 持久连接
- 传输类型
- 浏览器
SingulaR 文件列表如下
SignalR 的传输流
特点 |
WebSockets |
SSE |
永久帧 |
长轮询 |
服务器支持 |
服务器和浏览器应支持 WebSocket |
在建立初始客户端连接后启动传输 |
带有内容块的隐藏 iframe |
响应仍然发送,连接保持开放 |
实时连接类型 |
双向 |
单向。从服务器发送/接收事件
|
• 单向(服务器到客户端并持续向客户端发送脚本)
• 客户端到服务器(单独连接)
|
• 向服务器发起一个保持开放直到服务器响应的请求
|
持久连接 |
True |
假 |
假 |
假,缓冲区存储 |
满足实时要求的设计参数
问题陈述
性能会随着实时应用程序的扩展而逐渐下降,而且 ASP.NET、SignalR 线程和内存限制都具有 Web 请求的共同短期特性
少数可调参数集
扩展
扩展的三个主要因素是专业化、优化和分发
- 专业化——将应用程序组件化为更小的部分以隔离问题。MVC 通过拆分控制器、模型、视图以及图像服务器、流媒体服务器来解决同样的问题。
- 优化——通过减少给定操作所需的工作量来提供分发组件。这直接转化为扩展到相同数量的用户所需的服务器数量更少。
- 集群——集群中的每台服务器都会发送一条信息,让其他服务器知道它处于活动状态。有效集群的挑战在于消除亲和性/粘性。
它可以通过使用 Redis、SQL Server 的 Backplane 扩展方法进行扩展
状态
hub 代理的状态属性和 hub 中的调用者属性用于维护状态。状态可以通过多个连接和对数据库的方法调用来维护。不支持粘性会话,因为它限制了分发。
缓存
持久内存对象,如进程内会话和缓存对象,内存使用在扩展时变得更加有问题。每个 web 服务器从 redis 获取消息并将其存储在本地缓存中。SignalR 客户端(浏览器)从这个本地缓存中获取服务。
- 扩展缓存存储
- 专业化——将数据库划分为逻辑部分。这些分区可以是数据中心的。
- 集群:拥有多个数据库,每个数据库包含整个数据库的一部分。
性能
响应时间 = 负载/带宽 + 往返时间 (RTT) + 应用轮次/并发请求 + 服务器计算时间 (Cs) + 客户端计算时间 (Cc)
提高性能的扩展方法(负载均衡器 vs 背板)
负载均衡器 |
背板 |
客户端请求可以路由到不同的服务器。 |
每个应用程序实例/客户端向背板发送消息 |
连接到一台服务器的客户端将不会收到来自另一台服务器发送的消息。 |
背板将消息转发到其他应用程序/客户端实例。 |
背板服务器 - 概述
- 背板服务器是背板客户端之间消息交换的独立协调器,可以服务多个独立的总线。
- 每个服务器实例通过总线连接到背板。当发送消息时,它会发送到背板,背板将其发送到所有服务器。当服务器从背板接收到消息时,它将消息放入其本地缓存。然后服务器从其本地缓存向客户端传递消息。
- 会引入消息传递延迟,这对于低延迟工作效果不佳。如果有多台服务器来处理客户端,并且延迟通常很小,这可能无法奏效。
- 这里的权衡在于延迟和复杂性之间
- SignalR 支持 3 种背板:Azure ServiceBus、SQL Server、Redis
- 亚马逊网络服务 (AWS)
- 不支持 Azure ServiceBus
- EC2 中的 SQL Server 需要手动处理,这与在云基础设施上运行是反直觉的
- 支持 Redis
- SignalR 的默认 MessageBus 被设计用于该背板的总线替换。
结论
本文将帮助您理解 SignalR 的概述。