一般來說,Web應用的擴展有兩種:scale up(縱向擴展)和scale out(橫向擴展)。
1、縱向擴展
使用配置高(大內存,多處理器)的服務器或者虛擬機。
2、橫向擴展
使用多個服務器(Web Farm)。
SignalR支持橫向擴展,可以通過Backplanes(Azure Service Bus、Redis、SQL Server)來實現。
比如SignalR實現的一個簡單的聊天頁面, 部署到一個服務器,http://192.168.0.1/index.html。打開多個網頁訪問這個地址,任意頁面輸入的消息同時出現在各個頁面上。
如果部署到另一個服務器http://192.168.0.2/index.html,一個網頁打開http://192.168.0.1/index.html,另一個網頁打開http://192.168.0.2/index.html。分別發送消息,卻發現沒有同步。因為SignalR不支持不同服務器上的客戶端之前通信。即使部署在同一個服務器端的不同端口,不同端口的頁面間消息也不可以傳遞。
下面介紹如何使用SQL Server實現不同服務器上同一套Web應用間的消息傳遞。只需在SignalR實現的一個簡單的聊天頁面的Startup.cs添加兩行代碼(第5、6行)。
public class Startup { public void Configuration(IAppBuilder app) { string sqlConnectionString = WebConfigurationManager.ConnectionStrings["signalr"].ConnectionString; GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString); app.MapSignalR(); } }
添加代碼之前,需要NuGet安裝Microsoft.AspNet.SignalR.SqlServer並在Web.Config中配置數據庫連接字符串。
重新編譯然后部署到兩個服務器。http://192.168.0.1/index.html和http://192.168.0.2/index.html之間就可以通信了。
您可以用SQL Server Management Studio打開對應的數據庫,可以SignalR在數據庫里做了些什么。
本文如有不妥之處,請見諒!