SignalR的擴展功能- SignalR Scaleout with SQL Server
主題: |
SignalR的擴展功能- SignalR Scaleout with SQL Server |
文章簡介: |
介紹如何使用SQL Server來擴展SingalR應用程式服務 |
作者: |
陳傑雄 |
版本/產出日期: |
V1.0/2016.07.06 |
1. 前言
• 本教學展示如何使用SQL Server當作Backplane元件,避免用戶端連線不同主機上的SignalR Server應用程式,造成相互間訊息丟失的問題。
• 本教學使用的軟體本版本:Visual Studio 2015 / .NET Framework 4.5.2 / ASP.NET SignalR 2.2.0 / MSSQL Server 2012 Express。
2. 目的
• 藉由本教學了解ASP.NET SignalR Scaleout with SQL Server架構以及如何與用戶端連線溝通。
• 了解如何利用SQL Server當作Backplane元件,解決部署多部SignalR主機之間無法相互傳遞訊息的問題。
3. 開始前準備
本架構建立於以下版本的環境:
• .Net Framework 4.5.2
• .Net MVC 5
• IIS 8
• Visual Studio 2015 with updates
• ASP.NET SignalR 2.2.0
• MSSQL Server 2012 Express(至少需要2005以上版本)
4. 本文
4.1、 先來了解一下何謂「SignalR Scaleout」。相當多的情況下,架設即時聊天室系統不是一部伺服器主機就能夠服務為數眾多的用戶,因此,一般都會以多部主機來分散服務的負載,一方面當應用程式重啟或者伺服器軟體更新、維護甚至是斷線狀態,都必須有其他伺服器繼續服務。但是問題產生了,當不同的用戶連線到的伺服器不同時,他們兩者之間並無法互傳訊息;還好,SignalR提供了擴展元件,用來解決上述的問題:
• 當伺服器不斷地向外擴展(多部主機),用戶端可能路由到不同的伺服器,但連接到不同的伺服器之間是無法互相傳遞訊息的。
• 解決辦法是使用一個稱為Backplane元件作為伺服器之間的訊息轉發。下圖說明了SignalR如何使用Backplane元件架構。首先由接收到發送訊息請求的SignalR伺服器將訊息儲存到Backplane上,再由所有SignalR伺服器來處理訊息的接收與發送,最後送達用戶端。
• SignalR目前提供SQL Server、Azure Service Bus和Redis Cache三種Backplane,當然您也可以自行實現其他的Backplane架構,我們在此只介紹SQL Server,透過簡單的設定,一般開發人員熟悉的SQL資料庫就能儲存SignalR的訊息到資料表中,接著由Server Broker來有效的轉發訊息系統到所有的SignalR Server處理。
Note:Service Broker是為了增加效能,沒有啟用Service Broker還是能夠正常運行。
4.2、 開始使用SignalR scaleout with SQL Server前,我們簡單描述一下要完成的工作:
• 首先新建一個空的資料庫,Backplane將會在這個資料庫新建所有必要的資料表。
• 建立一個SignalR的專案,並加入Microsoft.AspNet.SignalR.SqlServer。
• 將下面的程式碼加到Startup.cs裡,用來設置Backplane:
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
string sqlConnectionString = "Connecton string to your SQL DB";
GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString);
app.MapSignalR();
}
}
4.3、 設定資料庫。請先確認您登入資料庫的帳號擁有建立資料表的權限。新建一個空的資料庫,後續它會用來當作Backplane。您只需要給資料庫名稱,但不需要建立任何資料表,Backplane會自動建立這些必要的資料表。
4.4、 啟用Service Broker。建議幫作為Backplane的資料庫啟用Service Broker,Service Broker提供SQL Server支援訊息的佇列,可以更有效率的接收更新和轉發。(不過,SignalR scaleout with SQL Server還是可以在沒啟用Service Broker的狀況下工作)
要檢查是否啟用了Service Broker,可以用SQL query工具查詢sys.database目錄檢視表中的is_broker_enabled欄位。
SELECT [name], [service_broker_guid], [is_broker_enabled]
FROM [master].[sys].[database]
若要啟用Service Broker,請使用下面的SQL查詢:
ALTER DATABASE YOUR_DATABASE SET ENABLE_BROKER
4.5、 新增一個SignalR的Web Application(可以參考「用 ASP.NET SignalR 建置即時聊天系統 」)。接下來,修改程式來支援Scaleout with SQL Server。首先,將SignalR.SqlServer加入專案,在Visual Studio中,開啟「工具」>「NUGet封裝管理員」>「套件管理器主控台」,並執行指令:
Install-Package Microsoft.AspNet.SignalR.SqlServer
接下來,打開Startup.cs檔案,將下面程式碼加到Configuration方法:
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
string sqlConnectionString = "Connecton string to your SQL DB";
GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString);
app.MapSignalR();
}
}
4.6、 部署和運行SignalR應用程式。
新增IIS角色,包含”Application Development(應用程式開發)”功能,勾選”WebSocket Protocol(WebScoket通訊協定)”。
此外再加上”IIS Management Script and Tools”(列在”Management Tools”底下)
如果您要用Web部署工具來發佈您的Web Application,那請安裝Web Deploy 3.0,當您運行IIS Management Tools時,它將提示您安裝Microsoft Web Platfrom,或者您可以下載 installer 。然後在其中搜尋Web Deploy 3.0。
確定Web Management Service是在運行狀態,如果不是,請啟動該服務。
最後,打開TCP 8172埠,這是提供Web Deploy使用的埠號。
現在將Visual Studio中的專案發佈到伺服器主機上,在「方案總管」視窗中,在方案上點右鍵並按下發佈。
如果您部署到兩台伺服器上,您可以開啟兩個瀏覽器,分別連到不同的伺服器,您可以看到他們都能接收到另外一台伺服器傳送過來的SignalR訊息。
當您運行您的SignalR應用程式後,可以看到SignalR已經自動在資料庫建立了相關的資料表。
上圖所示是SignalR管理資料表,您只需要部署您的應用程式,不要手動對這些資料表做刪除和修改…等等的動作。
5. 參考來源
• Learn About ASP.NET SignalR-http://www.asp.net/signalr/overview/getting-started
• SignalR Scaleout with SQL Server - http://www.asp.net/signalr/overview/performance/scaleout-with-sql-server