如何實現Session跨域共享

面試官意圖

問題思路

解決方案

基於NFS的Session共享

NFS是Net FileSystem的簡稱,最早由Sun公司爲解決Unix網絡主機間的目錄共享而研發。

這個方案實現最爲簡單,無需做過多的二次開發,僅需將共享目錄服務器mount到各頻道服務器的本地session目錄即可,缺點是NFS依託 於復 雜的安全機制和文件系統,因此併發效率不高,尤其對於session這類高併發讀寫的小文件, 會由於共享目錄服務器的io-wait過高,最終拖累前端WEB應用程序的執行效率。

基於數據庫的Session共享

首選當然是大名鼎鼎的Mysql數據庫,並且建議使用內存表Heap,提高session操作的讀寫效率。這個方案的實用性比較強,相信大家普 遍在 使用,它的缺點在於session的併發讀寫能力取決於Mysql數據庫的性能,同時需要自己實現session淘汰邏輯,以便定時從數據表中更新、刪除 session記錄,當併發過高時容易出現表鎖,雖然我們可以選擇行級鎖的表引擎,但不得不否認使用數據庫存儲Session還是有些殺雞用牛刀的架勢。

基於Cookie的Session共享

這個方案我們可能比較陌生,但它在大型網站中還是比較普遍被使用。原理是將全站用戶的Session信息加密、序列化後以Cookie的方式, 統一 種植在根域名下(如:.host.com),利用瀏覽器訪問該根域名下的所有二級域名站點時,會傳遞與之域名對應的所有Cookie內容的特性,從而實現 用戶的Cookie化Session 在多服務間的共享訪問。

這個方案的優點無需額外的服務器資源;缺點是由於受http協議頭信心長度的限制,僅能夠存儲小部分的用戶信息,同時Cookie化的 Session內容需要進行安全加解密(如:採用DES、RSA等進行明文加解密;再由MD5、SHA-1等算法進行防僞認證),另外它也會佔用一定的帶 寬資源,因爲瀏覽器會在請求當前域名下任何資源時將本地Cookie附加在http頭中傳遞到服務器。

基於Memcache的Session共享

Memcache由於是一款基於Libevent多路異步I/O技術的內存共享系統,簡單的Key + Value數據存儲模式使得代碼邏輯小巧高效,因此在併發處理能力上佔據了絕對優勢,目前本人所經歷的項目達到2000/秒 平均查詢,並且服務器CPU消耗依然不到10%。

另外值得一提的是Memcache的內存hash表所特有的Expires數據過期淘汰機制,正好和Session的過期機制不謀而合,降低了 過期Session數據刪除的代碼複雜度,對比“基於數據庫的存儲方案”,僅這塊邏輯就給數據表產生巨大的查詢壓力。

總結

基於Memcache 的存儲是這幾個方案中推薦選用的!

其它方案依然有其使用的場合,具體選用哪套需要開發人員的根據當前的服務器資源、網站併發壓力等綜合評估。

參考:
PHP多臺服務器跨域SESSION共享

****************************只要思想不滑坡,辦法總比困難多****************************
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章