2013-02-27 133 views
3

我已經實現了一個websocket服務器作爲WebRole.cs的一部分,到目前爲止它可以工作,用戶可以使用網站的URL和指定的端點連接到服務器。現在讓我們說我有50,000個用戶想要連接到websocket服務器,我將需要該web角色的更多實例來處理負載。在Windows Azure中的Web角色縮放

我的問題是,如果有多個web角色實例,這是否也會導致多個web套接字服務器?即,用戶是否仍然只使用一個URL/IP進行連接,並且所有連接都是相互連接的(例如,當廣播消息時),或者用戶是否需要輸入不同的IP來連接到不同的websocket服務器(每個實例一個)連接到同一服務器/實例上的用戶?

編輯:具體問題

因此,如果在連接用戶被添加到:

private static List<UserContext> Users = new List<UserContext>(); 

在WebRole.cs。我有一個廣播方式:

private static void Broadcast(String message) 
     { 
      foreach (UserContext uc in Users) 
      { 
       uc.Send(message); 
       Console.WriteLine("Broadcasting to: " + Users.IndexOf(uc)); 
      } 
     } 

將消息廣播到所有用戶在網站上,或將每個實例有它自己的用戶列表,因此只能廣播到連接到特定實例的用戶?

+0

您使用哪個UserContext(web套接字庫)? – 2013-02-27 10:41:24

+0

鍊金術網絡套接字 - http://alchemywebsockets.net/ – Matt 2013-02-27 10:56:07

回答

3

您要連接到的網站URL實際上是負載平衡器的URL,而不是特定的實例(與負載平衡器中的虛擬IP是公共IP相同)。在添加更多實例時,負載均衡器將通過循環法將流量引導至底層實例。除了公共URL和IP地址之外,您不應該擔心其他事情(虛擬網絡例外,負載平衡器未使用)。

Alchemy UserContext具有Endpoint ClientAddress。一臺服務器只有連接到它的用戶的源地址,而不是其他服務器。你將不得不從兩臺服務器進行廣播。因此,如果您在所有服務器上廣播(),您將捕獲所有用戶。儘管重複,但要小心。單個用戶可能會存在於多個服務器上,因爲NLB不會執行粘性會話。確保您的客戶端代碼可以處理來自多個服務器的相同消息

+0

因此,它會像所有的用戶都連接到同一臺服務器?例如。如果我寫道:'對於服務器上的每個用戶發送廣播',每個實例上的每個用戶都會收到該消息? – Matt 2013-02-27 09:40:08

+0

可能不是。一臺服務器只有連接到它的用戶的源地址,而不是其他服務器。你將不得不從兩臺服務器進行廣播。但是,您可能會得到重複的內容,因爲單個用戶可以爲每個請求在兩臺服務器之間切換。 – 2013-02-27 09:50:04

+0

感謝您的幫助!最後,我編輯了我原來的問題,給出一個更具體的廣播例子,你可以看看它,只是爲了確認。再次感謝:) – Matt 2013-02-27 10:27:40

4

儘管Simon對於負載平衡器將處理所有請求這一事實是正確的(您不必擔心需要連接哪個實例到),還有其他的事情你需要考慮。從你的問題我知道你想廣播消息,例如。

讓我們假設你縮放您的應用程序至2個:

  • 實例1
  • 實例2

負載平衡器會照顧所有的請求yourapp.cloudapp.net轉到其中一個實例(循環賽)。現在讓我們假設用戶A,B和C被路由到實例1和用戶d,E和F,以實例2:

  • 實例1:用戶A,用戶B,用戶C
  • 實例2:用戶d ,用戶E,用戶F

因此,讓我們假設用戶A在您的應用程序中執行了一些操作,並且您希望將其廣播給所有用戶。實例1只會看到2個其他連接的用戶:用戶B和C,並將消息發送給這些用戶。這裏的問題是你也想把消息發送給用戶D,E和F,儘管這些消息位於不同的實例上。

這就是爲什麼您的WebSocket/broadcast/...框架(如SignalR)需要使用類似於可從所有實例訪問的服務總線的原因。看看SignalR如何通過使用Windows Azure Service Busredis來解決這個問題。

+0

好的,從我在Azure服務總線上閱讀的內容中,我可以創建一個主題並在我的web套接字服務器(webrole.cs)類中訂閱它。每當從網絡套接字收到消息時,就會在服務總線上發送消息。每當總線上收到一條消息,它就會調用廣播。通過這種方式,所有實例都應訂閱服務總線並廣播所有消息。我會試試看,並讓你知道它是怎麼回事。感謝Sandrino的建議,你的回答對我所有的Azure問題都非常有幫助:) – Matt 2013-02-27 16:53:14

相關問題