ASP.NET SignalR 高可用设计
在 One ASP.NET 的架构图中,微软将 WebAPI 和 SignalR 归类到 Services 类型与 MVC、Web Forms 同列为一等公民,未来的 ASP.NET 5 尽管还在beta阶段,由它的架构图中可以发现原来就非常相似的 MVC 与 WebAPI 统一合并到 MVC 的大框架中了,而 SignalR 在未来依然在 Services 扮演着重要的角色。
SignalR 是一个集成了多种 HTTP 通讯方式并且优先使用 HTML5 Web Sockets 作为实时通讯管道的技术,而且其设计架构相当清晰易懂,在 ASP.NET 中作为提供即时消息通讯服务层的重要地位由此可见。
环境
开发 SignalR 应用程序前,应该认识 SignalR 技术对运行环境有一些基本要求,运行现行的SignalR 2.0 需要有 .NET Framework 4.5,服务器端需要 Windows Server 2008 R2 以上的操作系统以及 IIS7,如果使用 Web Sockets 来使 SignalR 技术得到最好的发挥,则应该运行于 Windows Server 2012 和 IIS 8 (开发环境需要 Windows 8 和 IIS 8 Express),因为 IIS 8 以上才可选择安装 Web Sockets 扩展组件。
联机管理
在 SignalR 中有一项十分重要的能力,就是「自动化的联机管理」,自动化的联机管理是在运行期间当客户端意外脱机时,SignalR Client Library 会在固定时间内自动地尝试重新建立联机以恢复与 Server 的对话状态,这个特性在现在的环境下显得十分重要,以下就举两个十分容易理解的场景:
移动联机
手机的网络联机状态向来没有桌面环境稳定,可能随时因为手机移动到不同的地方而发生时间不一的断线情况(地铁经常会发生这种情况),自动化的联机管理能够在这样的场景下得到不错的使用体验。
更新部署
另外一方面来看,造成断线的情况也不一定只有客户端会发生,当应用程序重启或者服务器端软件更新、停机维护状态,也会造成断线,后者更有可能产生长时间的网站脱机状态。经常发生的情况是在 IP (提供服务的VIP)位置不改变的情况下更换了服务器来提供服务,不知道您意识到了吗?SignalR Client Library 在这样的情况下会经历断线重连的阶段而且依旧运行得非常良好。
不过值得注意的是虽然 SignalR Client Library自动地处理了断线重连,但由于 Web服务器实例已经被完全置换,在架构上如果没有做相对应的设计,可能会造成原来运行中SignalR 部分消息的丢失,在下一段将说明 SignalR 中的 Backplane 机制来避免这种情况下消息可能丢失的情况。
SignalR Backplane
Backplane 是 SignalR 基于 publish/subscribe (以下简称 pub/sub) pattern 设计下的系统可扩展性架构设计,Backplane 将「信息」自「实例内部」移出到「外部存储服务器」中,让状态不再局限于 instance 个体上,以提供 SignalR Server scaleout 的能力,达到支持 Web Farm 架构。

上图说明了SignalR 是如何的使用 Backplane 架构实现 pub/sub pattern。首先由接受到信息请求的SignalR Server 将信息储存到 Backplane 上,再由多台 SignalR Server 处理信息的接收与发送,最后送抵 SignalR Client 端ƒ。
由于Backplane 架构的第一项特征便是将消息外移(动作),对于 Web Farm架构是必须有的设计,然而在单一instance 时也能从其中得到好处,可以不必担心应用程序部署 VIP SWAP 时可能发生的信息丢失问题,对于处理信息敏感的应用程序来说,这点来说相当地重要。
有多种支持 Backplane 信息向外储存的方式,包含了 SQL Server、Azure Service Bus 以及 Redis Cache,也可以自行实现其他的外存储方式,以下针对这三种扩充方式进一步的说明。
SQL Server
通过简单的设置,开发人员所熟悉的 SQL Database (或 SQL Server) 就能够用来存储 SignalR 信息到表中,接着由 Service Broker 来有效的转发信息到系统中所有的 SignalR Server 处理(注:Server Broker 是为了增加效率,没有 Service Broker 也能够正常运行)。

开发人员获得以 SQL Server 扩展 SignalR 服务的方式是通过 nuget 在项目中获取 Microsoft.AspNet.SignalR.SqlServer 组件,给予可提供储存数据的 SQL Database 储存个体的联机字符串即可,SQL Database 实例上不需预先建立表格,所需要的 table schema 会由 SQL Server 组件自动建立完成。
详细的实现信息,可由 ASP.NET 官网所提供的 SignalR Scaleout with SQL Server文章中获得。值得注意的是当使用 SQL Server 作为信息存储器,目前在信息转发的效率上较其他方案低上一些。
Service Bus
service Bus 是一项在 Azure 中重要的基础结构,提供了 Queue、Topic、Relay 以及 Notification Hub 等功能。其中 Topics 正是一个与 SignalR Backplane pub/sub pattern相同设计的典型服务。

详细的实现信息,可由 ASP.NET 官网所提供的 SignalR Scaleout with Azure Service Bus 文章中获得。
Redis Cache
Redis 是在内存内以键值 (key-value) 对方式储存的数据的服务,Redis 也支持 pub/sub pattern 来提供信息服务。详细的实现信息,可由 ASP.NET 官网所提供的 SignalR Scaleout with Redis 文章中获得。
Redis 利用内存的运行方式使得它是一个低延迟、高传输量的 Backplane 架构。
总结
ASP.NET SignalR 实在是个设计得非常漂亮的软件架构,无论是 WebApp、Mobile App甚或是 Desktop App,凡于信息处理的实时性与可用性十分重视的应用程序,都可以运用 SignalR架构出可用性非常高的实时互动体验。
ASP.NET SignalR 高可用设计的更多相关文章
- Kafka 高可用设计
Kafka 高可用设计 2016-02-28 杜亦舒 Kafka在早期版本中,并不提供高可用机制,一旦某个Broker宕机,其上所有Partition都无法继续提供服务,甚至发生数据丢失对于分布式系统 ...
- 第 18 章 高可用设计之 MySQL 监控
前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出 ...
- Redis源码阅读(二)高可用设计——复制
Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致 ...
- MySql(十八):MySql架构设计——高可用设计之 MySQL 监控
前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出 ...
- MySql(十七):MySql架构设计——高可用设计之思路及方案
前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库系统一旦出现问题无法提供服务,所有系统 ...
- MySQL性能调优与架构设计——第 18 章 高可用设计之 MySQL 监控
第 18 章 高可用设计之 MySQL 监控 前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一 ...
- MySQL性能调优与架构设计——第 17 章 高可用设计之思路及方案
第 17 章 高可用设计之思路及方案 前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库 ...
- RocketMQ消息发送流程和高可用设计
(源码阅读先看主线 再看支线 先点到为止 后面再详细分解) 高可用的设计就是:当producer发送消息到broker上,broker却宕机,那下一次发送如何避免发送到这个broker上,就是采用La ...
- 服务注册与发现-Eureka (高可用设计)
什么是高可用 部署需要考虑的是什么: 1.系统遇到单点失效问题,如何能够快速切换到其他节点完成任务 2.如何应对网络故障,即系统如何设计成"故障开放型"(expecting fai ...
随机推荐
- [WPF]WPF Data Virtualization和UI Virtualization
这篇博客将介绍WPF中的虚拟化技术. 1. Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载,仅加载当前需要显示的数据呈现给用户.这种场景会让我们想到数据分页显 ...
- 前端试题本(HTML+CSS篇)
CS1. 下面关于IE.FF下面CSS的解释区别描述正确的有?(不定项)CS2请选出结构正确的选项CS3.下面哪些是HTML5 新增的表单元素?CS4在使用table表现数据时,有时候表现出来的会比自 ...
- CentOS 7 安装后没有ifconfig命令
/bin,/sbin,/usr/bin,/usr/sbin下面都没有ifconfig命令. 执行命令 yum install net-tools 即可.
- Unity中无GC Alloc的CalculateFrustumPlanes
如果你需要在逻辑层做一些预先的剔除操作,可能需要从MainCamera构建视锥体,然后进行简易相交测试,这时候在unity里面用到的函数接口是CalculateFrustumPlanes: names ...
- sql基础大全
- to_char函数
TO_CHAR 是把日期或数字转换为字符串,不能指定字符串长度. 使用TO_CHAR函数处理日期:TO_CHAR(number, '格式') eg:TO_CHAR(salary,'$99,999.99 ...
- mysql查询练习题-2016.12.16
>>>>>>>>>> 练习时间:2016.12.16 编辑时间:2016-12-20-->22:12:08 题: 涉及:多表查询.ex ...
- TotoiseSVN的基本使用方法
TotoiseSVN的基本使用方法 在 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]中,我已经讲解了怎样安装TortoiseSVN.在上面的讲解中已经讲了怎么使用VisualS ...
- datatable 加序号列
最近使用datatable时,发现没有像jqgrid那样生成序号列,在国外网站搜罗了一下还是很简单的,就要在aoColumns中添加一空列占位就行,然后再用fnRowCallback添加序号 示例如下 ...
- CodeIgniter 3.0问题集锦
1.由于ci 3.0的session采用文件存储,在配置好session存储的目录后,在使用时如果遇到如下session错误. 此处 fc 目录为我设置的session目录. 解决将fc目录权限设为7 ...