2017-02-27 238 views
1

如果多個socket.io服務器(ALB平衡)客戶端正在連接並斷開兩個節點的連接,導致'傳輸錯誤'。理想情況下,它應該連接到一個節點並保持連接到該節點。在ALB中有一個節點的情況下,連接保持持久性。任何幫助?socket.io客戶端連接重複斷開連接

回答

1

默認情況下,當socket.io第一次啓動時,它將以http輪詢模式啓動。經過幾次連續的http請求,並在兩端的能力檢查完成後,它將切換到webSocket模式。這是爲了首先建立一個工作連接,然後確定兩端是否支持webSocket,如果是,則切換到使用webSocket。如果你有一個非粘性負載平衡器,那麼你確實可能會遇到前幾個http輪詢請求的問題,這些請求會在不同的服務器上結束,這可能會破壞socket.io的工作方式,因爲單個服務器會丟失一些連接啓動順序。

您可以將您的負載均衡器配置爲粘性,以便他們始終將同一個客戶端發送到同一臺服務器,或者您可以告訴socket.io您只希望它以webSocket模式連接。

配置socket.io僅使用一個網頁套接字和無輪詢(所以只有一個連接),你可以在這裏看到設置在客戶端的配置選項:

Socket.io 1.x: use WebSockets only?

請記住, socket.io具有自動連接邏輯,因此如果在建立到服務器的socket.io連接後很長一段時間,連接因某種原因停止工作,客戶端將丟棄當前連接並嘗試創建一個新連接。如果您仍在使用非粘性負載平衡器,則該重新連接可能會在不同的服務器上結束。取決於你在服務器上做什麼,可能會或可能不成問題。粘性負載平衡將確保重新連接在同一臺服務器上結束。

+0

使用連接直接使用傳輸作爲websocket而不是輪詢的任何缺點? –

+0

@VikasGoyal - 如果您在不支持webSockets的瀏覽器中運行,那麼您將無法獲得連接。 socket.io通常會通過用http輪詢代替丟失的webSocket來處理這種情況。 – jfriend00