標籤:c java tar a 檔案 資料
最近一個項目的伺服器老是出現Session資料丟失問題,導致使用者莫名其妙的退出,原因是太相信我們的營運人員所謂的負載平衡會話保持的概念。會話保持 的原理就是負載平衡通過Cookie來分發那個客戶串連被路由到那台後端具體伺服器,例如後端有兩台伺服器,負載平衡將會將所有的請求平均分配對應後端兩 台伺服器的cookie標識,後面的請求都會路由到具體的某台伺服器上。但絕對不是萬能的,我們就是因為太相信這個,才導致問題持續了很久沒有發現具體的 原因。至於為什麼不能保持會話,我到現在還沒有想明白,也沒有具體追問我們的運營人員。等有時間具體研究,這裡只是提醒大家不要假設負載平衡會為你穩定地 保持會話,因為此類問題在使用者量越大的時候越容易出現,出現的機率達到1%-2%,這對大規模的即時性項目是不能容忍的,例如線上集體考試。
那 麼在上述問題的前提下,很多朋友首先想到的是Cluster,特別是搞JavaEE開發的人,但記憶體複製型的Cluster配置還是比較複雜的,效率不一 定能達到我們想象的效果,其Session的恢複機制還是牽涉到儲存的問題。在PHP環境下大多數人直接預設採用PHP的檔案Session儲存策略,我 跟蹤了一下PHP的Session建立機制,一下子讓人毛色洞開,PHP在接收到一個使用者請求時,首先從請求的Cookie裡面拿Session ID,只要拿到,不管三七二十一,就認定這個Session ID了,即使當前沒有發現具體的Session存在,它也會為你建立一個對應該Session ID的會話。不像很多JavaEE應用伺服器,只要沒有Session,才不管你用戶端傳過來什麼,它都獨立會建立一個。PHP就Session處理這一 點,我們就可以做容錯形式的叢集了,最簡單的方法就是讓後端的多台伺服器共用同一個Session儲存區。就這麼簡單,簡單的簡直讓人不可思議。
那很多人擔心的是是否會發生Session隱藏檔讀取鎖定、等衝突呢?我的回答是,不會,如果會的話,單台機器也會。
文 件儲存Session最大問題是每次一個請求發生,並且調用了session_start(),都會開啟一次該檔案,並且讀取其中的內容到記憶體,當然向Session寫也是這樣,所以很多對吞吐能力要求高的PHP配置中可能會採用Memcache等記憶體機制,但可以肯定地說,我們也可以像共用硬碟一樣共 享Memcache,其核心的痛點應該是如何讓Memcache像一個共用儲存一樣。
一頭霧水的問題終於解決了,我們解決這個問題最痛苦的是日誌機制不完整,跨部門多,導致發現問題周折,但總算解決了,分享出來供大家參考,不要走我們的老路。