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 ...
随机推荐
- SecureCRT如何与Linux虚拟机进行关联
首先在宿主机上确认虚拟网卡是否正确工作,并查看其IP地址,如本例中,宿主机的虚拟网卡VMnet8的IP地址为:192.168.121.1/24. VMnet8是VMware用于NAT连接的虚拟网卡. ...
- Mysql 迁移最完整可用的教程
此教程来源stackoverflow,仅供我自己需要时查看,其他人不可以瞎看! ## Stop MySQL using the following command: `sudo /etc/init.d ...
- shell循环语句
所有的笔记只记录一些例子,根据例子解释一些出现的语法,不介绍具体的语法 2015-07-01 21:58:33 星期三 for循环 用例一用for循环在家目录下创建aaa1-aaa10,然后在aaa1 ...
- 【DWR系列02】-DWR逆向Ajax即服务器推送
.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...
- 10.Pattern 和 Matcher
Pattern:正则表达式的模式类 获取对象的函数Pattern pattern=Pattern.compiler(regex); 功能函数: 1.pattern.split(String targe ...
- Block Markov Coding & Decoding
Block Markov coding在一系列block上进行.在除了第一个和最后一个block上,都发送一个新消息.但是,每个block上发送的码字不仅取决于新的信息,也跟之前的一个或多个block ...
- tomcat的安全配置(禁用http方法,部署多个应用,启用从安全cookie,指定错误页面和显示信息)
配置版本:tomcat6 1,虚拟路径,可以配置多个host在一个tomcat中,docbase是web应用目录,此处在server.xml中添加应用配置,要让server.xml配置生效需要重启to ...
- [spring源码学习]单元测试演化
1.使用main方法 最早的测试方法一般是在类中增加main方法,然后在main方法中增加对每个方法的测试代码,如果要测其中一个,就屏蔽掉其他的测试代码,执行后,根据log的打印来判断测试是否成功 2 ...
- T-SQL Recipes之Separating elements
Separating elements Separating elements is a classic T-SQL challenge. It involves a table called Arr ...
- Attention:本博客暂停更新
Attention:本博客暂停更新 2016年11月17日08:33:09 博主遗产 http://www.cnblogs.com/radiumlrb/p/6033107.html Dans cett ...