2012-05-06 15 views
5

對於快速應用程序,我看到有一個用於存儲會話的connect-mongodb和connect-redis中間件,但我不明白爲什麼這是必需的 - 默認的內存中會話存儲有什麼問題?是否需要跨多臺機器同步會話的大規模應用程序?使用非連接默認會話存儲的優點是什麼?

此外,任何人都可以提供最快的會議商店的任何基準/技巧?我的猜測是Redis由於其更簡單的鍵/值存儲。

回答

12

將會話數據存儲在數據庫(MongoDB,Redis等)中的唯一原因是它可以跨節點進程使用,並且可以跨越故障持續使用。在橫向擴展體系結構中,非常希望擁有無狀態服務器,以便無論特定用戶連接到哪個服務器,服務器都可以在不丟失任何狀態的情況下上下運行,從而使所有內容都可以正常工作。

換句話說,想象一下負載平衡器後面有10個服務器處理傳入請求。用戶1請求服務器A處理並登錄。您需要存儲他們已登錄的事實,以便將其存儲在會話中。由於服務器A忙於處理另一個請求,下一個請求最終會被路由到服務器C.爲了使服務器C知道用戶已經登錄,它需要會話數據。那麼它如何訪問由服務器A存儲的會話數據呢?

一種方法是將數據存儲在每個請求提交的客戶端的cookie中,但這不是非常安全。另一種方法是跨節點服務器嘗試並同步狀態,這可以完成,但往往成本高且容易出錯。最簡單的方法是將會話ID存儲在cookie中,然後將實際會話數據存儲在數據庫中。每個節點服務器都可以訪問相同的數據庫,以便他們可以查找會話數據。通過這種方式,您可以輕鬆地擴展和擴展節點服務器,並在服務器發生故障時負載均衡,而不會丟失任何數據

就性能而言,內存存儲將是最快的(但有上述缺點)。 Redis將是下一個最快的,MongoDB將是最慢的(通常比Redis慢4倍)。請記住,對於絕大多數網站來說,要麼足夠快。

相關問題