65.9K
CodeProject 正在变化。 阅读更多。
Home

Signal R - 一个实时应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (17投票s)

2014 年 8 月 25 日

BSD

6分钟阅读

viewsIcon

31942

Signal R 基础。

引言

实时更多地与业务相关,而非技术。在日常生活中,为了做出实时决策,例如购买或投资,业务需要最新信息(例如黄金价格/股票价格)。与过去不同,他们无需等待几个月或几周才能获取市场趋势信息。

实时 (RT) 应用程序

实时应用程序即时且持续地提供信息。应用程序的效率主要取决于其对错过的时间要求的容错能力。在实时应用程序中,所需的响应时间是通过定制硬件和软件组合实现的,可能没有-或者只有非常薄的操作系统层。由于它们持续运行,需要对其性能指标进行密切分析。

下面列出了一些实时应用程序
  • 视频会议应用程序
  • VoIP(互联网协议语音)
  • 在线游戏
  • 社区存储解决方案
  • 一些电子商务交易
  • 聊天
  • 即时消息(IM)
  • 当前活跃访客,当前登录用户
  • 朋友上线或下线时
  • 有人点赞或评论状态时
  • 向订阅用户发送事件通知
  • 有多少人正在积极玩某个游戏,观看在线网络研讨会/活动等
  • 迄今为止的总交易量、购买量、展示量、消息量、点击量等等

软实时 vs 硬实时

特点

软实时

硬实时

失败/延迟时

应用程序可以继续运行,用户虽然不满意,但仍可以使用它。

必须严格满足实时时序要求,因为延迟的结果可能是灾难性的。

性能

不可预测的性能得到用户的容忍

不可预测的性能影响响应时间要求,对应用程序影响巨大

示例

应用程序对鼠标点击响应超过0.1秒。

控制飞机方向舵的应用程序

交付百分比

至少99.9%的响应应在特定的实时时间内交付

99.999%的响应应在特定的实时时间内交付

使用 SignalR 进行实时网络应用程序开发

什么是 SignalR

信号用于通信(例如模拟和数字)。R 代表实时。
实时网络是指服务器代码能够即时将内容推送到连接客户端的能力。SignalR 简而言之是指实时应用程序通信

它有什么作用?

  • 通过 HTTP 连接,将内容从服务器推送到客户端 RPC。
  • 它是一个连接抽象。它给人的印象是在一个永久开放的持久连接上工作。它不是可靠的消息传递。
  • 它通过消息总线发送每条消息。
  • 它支持 CORS-跨源资源共享或 JSONP-带填充的 JSON(在 Web 浏览器中运行的 JavaScript 程序用于从不同域的服务器请求数据的一种通信技术)

如何测量和监控

  • 性能计数器提供自上次应用程序池或服务器重启以来的事件数量。
  • 连接指标、消息指标、消息总线指标、错误指标、横向扩展指标

SignalR 概述

使用的模式:
它采用中心辐射模式设计。SignalR 位于中心,所有其他浏览器都可变、灵活且与中心上下文相关。
结构

 

它主要分为以下四个领域。

  • Hub
  • 持久连接
  • 传输类型
  • 浏览器

SingulaR 文件列表如下

SignalR - 一个元包,引入 SignalR.Server 和 SignalR.Js
SignalR.Server - 构建 SignalR 端点所需的服务器端组件
SignalR.Js - SignalR 的 Javascript 客户端
SignalR.Client - SignalR 的 .NET 客户端
SignalR.Ninject - SignalR 的 Ninject 依赖解析器

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 的概述。

© . All rights reserved.