2015-10-22 104 views
1

我們在大型Web應用程序中使用SignalR。我們部署了多個處理signalR連接的Web服務器。我們有我們自己的Redis背板,我有以下問題: SignalR對服務器進行三次調用:1)協商,2)連接和3)啓動。如果我們在Load Balancer後面有一個Web場,並且這三個調用最終會連接到三臺不同的服務器,那麼連接狀態是否會在所有三臺服務器上損壞?在這種情況下會發生什麼?我不是在談論消息傳遞。Web農場中的SignalR連接管理

更具體地說:

  1. 會第二web服務器能夠理解通過談判調用生成的的ConnectionId ?

  2. 在物理連接(的WebSockets)是在不同的服務器上建立 ,然後開始通話轉到另一個 服務器會發生什麼?

我知道SignalR沒有傳達服務器之間的連接信息。我想知道這三臺服務器的內存連接狀態。 我讀了與此相關的另一個問題,但它只談論消息傳遞。對我們來說,信息傳遞不是問題。如果這三個調用最終轉到不同的服務器,我想了解連接的最終狀態。

,我已經經歷得到答案的問題: SignalR connection affinity in web-farm scenario

由於我們的負載均衡器保持粘性,我無法確認什麼時候會發生粘性消失。我想爲這種可能性做好準備。

+0

嘿guruprasath,只是想知道如果你得到的回答這個問題?目前,我們有一個服務於該應用程序的服務器場,我們使用的是Azure中託管的Redis背板。在我的情況下,負載平衡器沒有粘性會話,我看到超時並斷開與websocket,我相信這是你所擔心的。我感到困惑的部分是基於我在文檔中讀到的內容,傳輸連接直接與背板連接,這意味着負載均衡器沒有什麼區別......但我們沒有看到單個節點環境的問題。 – ammills01

+0

@ ammills01,我沒有得到答案。我嘗試在另一個jabber頻道發帖,但沒有運氣。根據你所描述的,我猜你的問題與粘性無關。我們使用我們自己的Redis集羣來定製背板。所以,我無法談論他們提供的Redis背板的穩定性。我的理解是,傳輸連接不是背板(這將是一個安全問題)。傳輸連接與前端Web服務器支持websockets。所以,負載平衡器的粘性可能很重要。 – guruprasath

+0

感謝您的回覆。在進一步挖掘之後,我得出了與此處提到的相同的結論,傳輸是在SignalR服務器上進行的,因此請求中沒有粘滯的會話就會反彈並失敗。當發生這種情況時,你會得到超時,如果你配置了longPolling或其他傳輸技術,當你建立你的SignalR連接時,它將會故障轉移到其中一個。對我們來說,它擊中longPolling並且應用程序似乎可以正常工作,只需要更多的服務器資源。 – ammills01

回答

0

老問題,但我抽出時間來回答,因爲我有一個類似的設置,儘管有不同的技術。它可能不能完全解決你的問題,但我認爲可以畫出很多相似的東西。

我們的場景中實時通信(即聊天消息)。當其他用戶登錄時,斷開連接,服務器將隨時通知客戶端等

下面

技術堆棧:

客戶:AngularJS應用

CDN:提供靜態資源(HTML,CSS,圖像)

負載均衡器:安裝在Azure中

多的WebApp:運行ASP.NET的核心

多個SQL Server數據庫:鏡像

這裏的關鍵點是應用程序保持整個無狀態的。在任何時候,客戶端可以斷開/重新連接,並檢索它在斷開連接之前所具有的同一組信息。

  • 用戶使用令牌機制進行身份驗證(本例中爲OAuth)。所有的用戶信息(用戶標識等)都被加密。

  • 建立連接並路由到正在運行的任何一個Web應用程序。

  • Webapp將連接信息存儲在數據庫表中。

  • Webapp檢索在數據庫中有連接的用戶的所有「朋友」。

  • Webapp將列表發送回客戶端。

  • 每當用戶斷開連接時,webapp都會收到斷開連接事件並刪除記錄表單數據庫。

  • 當用戶重新連接時,webapp將連接添加回來,並向用戶發送當前在線連接/客戶端列表。

客戶端需要維護它的狀態以及如何對客戶端列表中的更新做出反應。

此方法與您在問題中發佈的答案中提到的方法類似。

我相信這裏的基本概念是背板。它堅持了狀態,而不是僅僅圍繞服務器進行通信。

這裏一個相關的博客文章可能有幫助:https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections

(在「多臺服務器」的情景看看)

+0

在背板上多讀一點答案,我相信這個概念是一樣的。我已經給出了我的方法大綱。很明顯,我們已經做了優化,例如在每次請求後使用新連接的客戶端列表進行響應,而不是整個列表(您的文章中提到的光標事件)。 – l3utterfly