横向扩展你的ASP.NET Core SignalR 应用
前言
最近項目要用signalr來做實時通信,在研究asp.netcore signalr 應用橫向擴展時候發現了這篇國外的博客,和大家分享一下
原文連接地址
負載均衡
當你把你的應用部署到生產環境時,你將會想橫向擴展你的應用。橫向擴展意味著要你的應用要在多臺服務器上運行。
當應用運行在云端進行橫向擴展時,你要考慮的主要問題時設置你想運行服務器的數量。有一種叫做負載均衡的機制,
這種機制會對每個傳入的請求選擇一個服務器。負載均衡能按照順序選擇不同的服務器或者根據其他的處理邏輯繼續選擇同一個。
Websockets
當使用web sockets時沒有什么問題(譯注:意思指使用無狀態的負載均衡時候)。因為web sockets一旦建立了就像服務端和瀏覽器建立了一個管道。但是當使用輪詢或者長輪詢時候就可能出現,每個消息時不同的請求并且每個處理的請求都能轉換到不同的服務器。服務器坑不知道之前發送到這個客戶端的消息和關于這個消息的上下文。
舉例你的應用被橫向擴展到不同服務器山,服務器1正在獲取關于準備訂單1(prepare order 1)的請求然后它開始處理這個請求。當你使用長輪詢方式進行請求時候,接下來的請求會通過負載均衡分配到不同的服務器。這個服務器是不知道關于 訂單1(order1)的信息的。
對于服務端發送事件(譯注:關于服務器發送事)也會出現同樣的問題,因為http連接可能會被刪除,這個連接將立刻會通過在瀏覽器的事件源(EventSource)恢復。
粘連會話(Sticky Sessions)
我們能通過使用粘連會話解決這個問題。粘連會話有很多種實現,大部分實現方式如下,對于第一次請求的響應負載均衡能在瀏覽器設置一個cookie用來指明這個使用的服務器。在接下來的請求負載均衡能讀取這個cookie并且分配這個請求到同一臺服務器。
IIS和Azure web應用的粘連會話的版本稱作應用請求路由關聯(Application Request Routing Affinity )或者 ARR Affinity。自從SignalR能使用 非web sockets 傳輸協議,當你使用已經安裝好ARR Affinity 模塊的IIS內網服務器時,你就應該在你應用運行的所有的服務器端開啟它。同時也要確保web sockets也同樣是要開啟的。否則你的服務器將會使用服務器發送事件。
在不同應用實例之間同步客戶端
但是這里會存在另外一個問題。舉例說一個使用Office 365的用戶通過web document 工作,然后她邀請了其他人加入。其他人可能在與先前用戶不同的服務器上。現在當使用服務器1的用戶(譯注:指第一個用戶)不得不發送 改變文檔的消息到其他人。但是服務器1不知道在其他服務器上連接這個 管道(Hub)上的其他用戶的信息。為了解決這個問題服務器需要一種方式進行數據共享。這樣方式能通過數據庫來實現,但是用一個存儲更快的可替代的方案就是使用redis緩存。SignalR支持開箱即用的redis,我們接下來就會看到。它實際上就是使用了Redis內置的發布訂閱功能來同步不同服務器上的客戶端信息。
解決這個問題是非常簡單甚至不需要一個截圖。安裝一個Microsoft.AspNetCore.SignalR.Redis nuget包。然后在startup類中的 configure services方法中的AddSignalR后面輸入 AddRedis 并且傳入一個redis連接字符串。你能自己搭建Redis服務器或者使用 Azure Redis service。除了Redis你同樣也可以使用社區構建的其他數據存儲。但是Redis的優勢就是它甚至不需要持久化這個數據。
Azure SignalR Service
除了粘連會話、Redis 緩存我們還沒有討論連接限制。每個客戶端同時有六個連接的Http連接限制。當使用長輪詢或者服務器發送事件這個限制很快就會達到了。即使web sockets也有大約50個連接限制。如果你不喜歡管理這些東西,這里有一個一站式解決方案:Azure SignalR Service。它的工作原理如下:
所有的客戶端連接都被托管在Azure SignalR Service上,所以客戶端并不是真正連接到你應用運行的服務器上。當一個新的客戶端連接或者你發送一個消息到所有的客戶端或者分組或者獨立的客戶端時候,你的應用實際上經過了一個管道連接,這個管道連接負責與SignalR Service(譯注:指Azure SignalR Service)通信。只要你為需要同時支持的連接付費,那么你所有包含hub的應用代碼只需要運行在服務器上,你關心的 粘連會話、Redis緩存以及連接限制都將不是事兒。
結合Azure SignalR Service 和增加Redis緩存一樣簡單。(譯注:這里有一個github上關于signalr 客戶端同步的issue,供大家參考一下,鏈接地址)
原文地址:?https://bluetianx.github.io/2018/08/18/Asp-netCoreSignalR/
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的横向扩展你的ASP.NET Core SignalR 应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net core grpc 实现通信(
- 下一篇: ASP.NET Core Web API