叢集WEB應用或多或少都會遇到session問題,在多台伺服器的情況下,session的要地儲存會造成一些問題,影響使用者體驗。
配置Nginx負載策略,例如ip_hash
,使客戶端綁定在固定伺服器上,這樣最終用戶存取到的機器是固定的,所以session
儲存在本地,不影響用戶使用。但缺點主要有兩項:
ip_hash
分配並不均勻,尤其是用於ip_hash
的Nginx不是最前端時,可能無法使用此策略
假如不考慮負載均勻問題,仍然存在的問題是,當後端某台機器宕掉時,這台機器上所有的session
都會失去,假如session
中記錄的用戶的認證狀態,那麼使用者將變成未認證狀態
伺服器(Nginx代理的伺服器)間進行session
廣播,這種方式存在的問題是,隨著叢集規模的擴張,廣播的效能會變得很差,一般不建議使用
使用session
共享方案,具體使用redis
還是使用memcached
這裡不討論,這裡假設使用redis
,方法也很簡單,將session
的存儲實現red
可以使用HttpServletRequestWrapper
方式來動態修改session
的memcached-session-manager
或者spring-session
等實現,除了集中存儲對性能(相對於本地存儲)
個人也想了一個有缺陷的辦法,反正也只是設想,從來沒用過。
session
廣播的方式隨著叢集規模擴大,效能會下降,那麼就不所有機器間廣播,可以兩台、三台之間廣播,假設以兩台為一組,所有叢集中的伺服器,以兩台為單位分組,相互廣播
補充紀錄
[2016/9/1]
個人認為完全可以避免使用session
,servlet
系的應用做分佈式本就有很多限制,如果要實現分佈式,最好的辦法是利用http
的無狀態特性來實現,當然,用戶登入、購物車等資訊確實需要進行狀態存儲,這些完全可以直接存儲到第三方存儲中,例如:redis
、mysql
等,其本質上類似於