需求:
有個ASP.NET網站系統,有頂層網域,次層網域,第三層網域名,系統的各個功能模組分布在不同的網域名稱,同一網域名稱的也有可能分布在不同省份的伺服器或者同一省份的不同的伺服器中,同一省份的的伺服器可以通過內部區域網路訪問。在系統中,現在需要所有功能模組共用使用者同一次會話中的私人資料。
常用的方式是啟用Session的資料庫持久會模式可以達到上面的需求(沒嘗試過),現在需要使用Memcached分布式快取服務來達到儲存使用者的會話資料,而達到各個功能模組都能夠跨省份、跨伺服器共用本次會話中的私人資料的目的。
解決方案:
每個省份使用一台伺服器來做為Memcached伺服器來儲存用話的會話中的資料,當然也可以多台伺服器,但必須確保每個省份的做Memcached伺服器數量必須一致,這樣才能夠保證Memcached用戶端操作的是同一份資料,保證資料的一致性。
會話資料的添加、刪除、修改:
Memcached用戶端,添加、刪除和、修改會話資訊資料時,不僅要添加、刪除、修改本省的Memcached伺服器資料,而且同時要對其它省份的Memcahed伺服器做同樣的操作,這樣使用者訪問其它省份的伺服器的功能模組進也能讀取到相同的會話資料。Memcached用戶端伺服器的列表使用區域網路的內網IP(如:192.168.1.179)操作本省的Memcahed伺服器,使用公網的IP((如:202.183.62.210))操作其它省份的Memcahe伺服器。
會話資料的讀取
系統所有模組讀取會話資料的Memcached用戶端伺服器列表都設為本省Memcached伺服器位址的內網IP來向Memcahed伺服器中讀取會話資料。
如所示,A省有四台伺服器,B省也有四台伺服器,兩個三份都有三台Web伺服器、一台Memcached伺服器,且A省四台伺服器同在一個區域網路內的可能通過內網IP相互訪問,B省也一樣。假如:A省的A1,B1,C1這三台Web伺服器其中的一台要添加或修改、或刪除會話資料,它首先調服Memcached用戶端使服D1伺服器的內網IP向D1伺服器中添加或修改、或刪除會話資料,操作完成後,還用調用Memcache用戶端使服D2伺服器的公網IP向D2伺服器做同樣的操作,這樣才算完整的操作過程,也可以當做一個事務來處理。假如:A省的A1,B1,C1這三台Web伺服器其中一台伺服器想要讀取會話的資料,只需要調用Memcached用戶端使服D1伺服器的內網IP讀取資料即可,如果發現該資料不存在,即做向Memcached伺服器添加資料的相關業務處理。B省處理邏輯同A省。
同一會話的確認:
使用Cookie來保持客戶與服務端的聯絡。 每一次會話開始就產生一個GUID作為SessionID,儲存在用戶端的Cookie中,範圍是頂級網域名稱,這樣二級、第三層網域名就可以共用到這個Cookie,系統中就使用這個SessionID來確認它是否是同一個會話。
會話資料的唯一ID
會話資料存放區在Memcached伺服器上的唯一鍵Key也就是會話資料資料的唯一ID定義為:SessionID_Name, SessionID就是儲存在用戶端Cookie中的SessionID, Name就是會話資料的名稱,同一次會話中各個會話資料的Name必須是唯一的,否則新的會話資料將覆蓋舊的會話資料。
會話的失效時間:
會話的失效通過控制Cookie的有效時間來實現,會話的時間設為SessionID或Cookie中的有效時間,且每一次訪問SessionID時都要重新設定一下Cookie的有效時間,這樣就達到的會話的有效時間就是兩次間訪問Cookie中SessionID值的的最長時間,如果兩次訪問的間隔時間超過用效時間,那麼儲存在SessionID的Cookie將會失效,並產生新的SessionID存放在Cookie中, SessionID改變啦,會話就結束啦。
Memcached伺服器中會話資料的失效
每一次向Memcache伺服器中添加會話資料時,都把有效時間設為一天也就是24小時,讓Memcached服務使用它內部的機制去清除,不必在程式中特別做會話資料的刪除操作。資料在Memcache伺服器中有有效時間只是邏輯上的,就算是過了24 小時,如果分配給Memcached服務的記憶體還夠用的話,資料還是儲存在記憶體當中的,只是Memcache用戶端讀取不到而已。只有到了分配給Memcached服務的記憶體不夠用時,它才會清理沒用或者比較舊的資料,也就是懶性清除。
晚啦,該睡啦! 非常希望各位大哥大姐指點指點!