1. 程式人生 > >橫向擴充套件你的ASP.NET Core SignalR 應用

橫向擴充套件你的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並且分配這個請求到同一臺伺服器。

640?wx_fmt=png

IIS和Azure web應用的粘連會話的版本稱作應用請求路由關聯(Application Request Routing Affinity )或者 ARR Affinity。自從SignalR能使用 非web sockets 傳輸協議,當你使用已經安裝好ARR Affinity 模組的IIS內網伺服器時,你就應該在你應用執行的所有的伺服器端開啟它。同時也要確保web sockets也同樣是要開啟的。否則你的伺服器將會使用伺服器傳送事件。

640?wx_fmt=png

在不同應用例項之間同步客戶端

但是這裡會存在另外一個問題。舉例說一個使用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。它的工作原理如下:

640?wx_fmt=png

所有的客戶端連線都被託管在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

640?wx_fmt=jpeg

相關推薦

橫向擴充套件ASP.NET Core SignalR 應用

前言最近專案要用signalr來做實時通訊,在研究asp.netcore signalr 應用橫

ASP.NET Core SignalR 中使用 MessagePack

keepaliv edi nal contract GDPR spa let 字符 addm It‘s like JSON.but fast and small. MessagePack is an efficient binary serialization forma

LayIM.AspNetCore Middleware 開發日記(七)Asp.Net.Core.SignalR閃亮登場

you socket https image upm ogg 通訊 () aspnet 前言 ??前幾篇介紹了整個中間件的構成,路由,基本配置等等.基本上沒有涉及到通訊部分。不過已經實現了融雲的通訊功能,由於是第三方的就不在單獨去寫。正好.NET Core SignalR已

Asp.Net Core + SignalR 實現實時通訊

一、搭建專案 1、建立一個ASP.NET Core MVC 專案   2、nuget 下載和安裝 MicroSoft.AspNetCore.SignalR vs提示版本衝突 這時我們選擇低版本即可 二、SignalR配置 1、在model中建立一個類MyHub 程式

asp.net core web 應用程式的佈局

環境:asp.net core 2.1 在web應用程式中,許多頁面都有相同的一部分,如頁面的頭部,標題或者底部版權資訊等在大部分頁面都是通用的,為了避免重複程式碼,我們可以使用“佈局(layout)”。 在asp.net core web應用程式中,使用佈局的方式:

ASP.NET Core SignalR中的流式傳輸

什麼是流式傳輸? 流式傳輸是這一種以穩定持續流的形式傳輸資料的技術。 流式傳輸的使用場景 有些場景中,伺服器返回的資料量較大,等待時間較長,客戶端不得不等待伺服器返回所有資料後,再進行相應的操作。這時候使用流式傳輸,可以將伺服器資料碎片化,當每個資料碎片讀取完成之後,就只傳輸完成的部分,而不需要等待所有資

ASP.NET Core MVC應用程式中的後臺工作計劃任務

  在應用程式的記憶體中快取常見資料(如查詢)可以顯著提高您的MVC Web應用程式效能和響應時間。當然,這些資料必須定期重新整理。   當然你可以使用任何方法來更新資料,例如Redis中就提供了設定快取物件的生命時間,那麼對於這種單物件的更新的做法我覺得是不符合我的程式設計習慣的,我們可以使用Quar

ASP.NET Core SignalR 與微信小程式互動

點選上方“程式設計師大咖”,選擇“置頂公眾號”關鍵時刻,第一時間送達!來源:James.Ying

Asp.Net Core SignalR 與微信小程式互動筆記

什麼是Asp.Net Core SignalRAsp.Net Core SignalR 是微軟開

Asp.Net Core Web應用程序—探索

沒有 sem 依然 host 福音 頁面 gin 圖片地址 網絡 前言 作為一個Windows系統下的開發者,我對於Core的使用機會幾乎為0,但是考慮到微軟的戰略規劃,我覺得,Core還是有先了解起來的必要。 因為,目前微軟已經搞出了兩個框架了,一個是Net標準(.N

ASP.NET Core Web應用在發布時選擇是否對視圖進行編譯

span shee core 將在 lin eas 行修改 mpi property 原文:ASP.NET Core Web應用在發布時選擇是否對視圖進行編譯

ASP.NET Core SignalR:集線器Hubs

一、什麼是集線器hubs   通過SignalR的集線器hubs中定義的方法,伺服器可以呼叫連線中的客戶端定義的方法,而客戶端也可以呼叫伺服器端集線器中定義的方法。SignalR負責實現了客戶端和伺服器之間的實時通訊。 二、配置SignalR的hubs   SignalR通過在Startup.Configur

ASP.NET Core SignalR :學習訊息通訊,實現一個訊息通知

 什麼是 SignalR        目前我用業餘時間正在做一個部落格系統,其中有個功能就是評論通知,就是假如A使用者評論B使用者的時候,如果B使用者首頁處於開啟狀態,那麼就會提示B使用者有未讀訊息。暫時用SignalR來實現這個功能。我也是看了兩天的資料才

Kubernetes初探[1]:部署的第一個ASP.NET Core應用到k8s叢集

Kubernetes簡介 Kubernetes是Google基於Borg開源的容器編排排程引擎,作為CNCF(Cloud Native Computing Foundation)最重要的元件之一,它的目標不僅僅是一個編排系統,而是提供一個規範,可以讓你來描述叢集的架構,定義服務的最終狀態,Kubernete

ASP.NET Core 十種方式擴充套件的 Views

現在,已經有很多種方式來擴充套件Razor檢視了,我們循循漸進,先從最簡單的開始。 如果你之前熟悉MVC5(以及之前的MVC)中的檢視的話,有一部分你應該已經很熟悉了。在新的ASP.NET Core 中,那些你熟悉的方式有一部分仍然能用,只是Core版本針對檢視又添加了一

將終結點圖新增到ASP.NET Core應用程式中

在本文中,我將展示如何使用`DfaGraphWriter`服務在ASP.NET Core 3.0應用程式中視覺化你的終結點路由。上面文章我向您演示瞭如何生成一個有向圖([如我上篇文章中所示](https://www.cnblogs.com/yilezhu/p/13301981.html)),可以使用[Grap

ASP.NET Core應用基本程式設計模式[5]:如何放置的初始化程式碼

一個ASP.NET Core應用的核心就是由一個伺服器和一組有序中介軟體組成的請求處理管道,伺服器只負責監聽、接收和分發請求,以及最終完成對請求的響應,所以一個ASP.NET Core應用針對請求的處理能力和處理方式由註冊的中介軟體來決定。一個ASP.NET Core在啟動過程中的核心工作就是註冊中介軟體,本

ASP.Net Core 3.1 使用實時應用SignalR入門

參考文章:微軟官方文件:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-3.1 和 https://www.cnblogs.com/cgzl/p/9509207.html 系列 ASP

Linux使用Jexus托管Asp.Net Core應用程序

技術 文件目錄 只需要 true 沒有 repr tag 博文 env 第一步 安裝.Net Core環境 安裝 dotnet 環境參見官方網站 https://www.microsoft.com/net/core。 選擇對應的系統版本進行安裝。安裝完成過後 輸入命令查

簡陋的 ASP.NET CORE 單頁Web應用程序“框架”

esp idt 後退 width name min 什麽 模式 clas 我對ASP.NET CORE了解不多,不知道是不是重復造輪子,也或者什麽也不是,這個Demo是這樣的: 1、非常簡單或者說原始;2、將單頁Web應用增加了一個頁(Page)概念(相當於MVC的 Vi