2016-06-23 95 views
0

我想創建一個無狀態服務器,以便如果任何服務器停機,負載均衡器可以將請求重定向到其他服務器。但是,如果會話是在一臺服務器上創建的,並且它停滯了,那麼如何保存它。我正在使用mysqlstore將會話保存在數據庫中,但是對於每臺服務器,它會在數據庫中創建一個新記錄,因此會話ID不會跨不同的服務器所以,需要一種使服務器無狀態的機制。如何在nodejs中跨服務器共享會話?

+1

根據定義,無狀態應用程序不會維護會話。會話是狀態。你確定你問的是正確的問題嗎? – Paul

+0

如果服務器出現故障,您不必擔心重定向。 AWS ELB自動將其標記爲不健康,並將流量發送到連接到負載平衡器的另一臺運行狀況服務器。 – error2007s

+0

使用應用程序控制會話粘性http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-sticky-sessions.html#enable-sticky-sessions-application – error2007s

回答

1

我猜你正在使用express-session,因爲它沒有其他說明。

你在mysqlstore的正確軌道上。解決Node的單線程問題的方法是消除express-session,然後加密會話數據並將其放入客戶端Cookie中。然後,您可以在GET請求上解密會話數據,並使用cookie中的隔離鍵在數據庫中對其進行驗證(如果不存在,則創建新的會話/ cookie對)。

爲此,最流行的Node.js中間件是cookie-session.偉大的文檔,以及。

https://github.com/expressjs/cookie-session

作爲一個側面說明,因爲它聽起來就像你在一個非常可擴展的地方,現在有多個服務器,這是值得開溝express-session反正。 express-session使用MemoryStore,它存在內存泄漏的已知問題。很好用於較小的項目,但可能應該重新考慮更大的項目。