2016-12-13 67 views
1

我試圖在負載平衡器後面安裝websocket服務器。起初,我使用了socket.io庫。但是我發現它在負載平衡器後面使用時需要sticky sessionws websocket服務器庫在負載均衡器後面使用時是否需要粘性會話?

根據this website,它發送多個請求以執行握手和建立連接。如果請求發送到不同的服務器,連接將失敗。

進一步研究後,我發現,像SockJS其他的WebSocket服務器庫也有同樣的問題。它們都需要粘性會話才能在負載平衡器後面工作。

現在我檢查的WebSocket庫ws。但我找不到在負載平衡器後面使用它的任何示例。

是否ws庫需要粘性會話工作?

是否有任何其他的WebSocket庫,可以在不粘性會話工作在負載均衡?

+0

我不這麼認爲。您需要在所有服務器上覆制套接字會話,以避免粘滯會話。 – Hosar

回答

2

是否有一個特定的原因爲什麼你不能/不想依賴粘性會話?

如果你想分配套接字連接跨多個主機,你將需要一些解決方案,粘滯會話是一個非常好的。

您鏈接的socket.io page on using multiple nodes甚至描述了通過NginX實現解決方案「通過基於客戶端的發送地址路由客戶端」的方法。你試過這個,發現它不起作用?

還有上Horizontally Scaling Node.js and WebSockets with Redis一篇很好的文章介紹了其解決你有確切的問題與粘性會話和自動故障轉移。

+0

我知道我們可以根據客戶端的IP地址爲客戶端路由創建粘性會話。我們還可以使用更好的方法來注入cookie,然後根據cookie路由客戶端,如最後一段中的鏈接所示。但是,如果可能的話,我絕對想避免使用粘性會話。如果我們在負載平衡器中使用粘性會話,則不可能在負載平衡器後面的服務器之間均勻分配負載。 – userpal

+0

例如,假設我們創建基於源IP的粘性會話,如果來自1個公司網絡的使用NAT(使用1個公共IP)的500個客戶端,所有這些客戶端都將路由到同一個服務器。在這種情況下,1臺服務器將過載,而其他服務器空閒。使用cookie創建粘性會話稍好一些,但是,只要我們使用粘性會話,就不可能在服務器之間均勻分配負載。 – userpal

+0

我希望我們可以像HTTP服務器一樣水平擴展websocket服務器,並且負載均衡器能夠平均分配負載到所有服務器。在最後一段中的鏈接中,它提到''...這並不總是必要的,但是當使用像SockJS這樣的東西時,這可以防止用戶在服務器之間跳轉,如果它們退回到輪詢「'。看起來粘滯的會話只有在回退到輪詢時才需要。 – userpal

相關問題