2024-03-08|閱讀時間 ‧ 約 23 分鐘

一個簡單處理 Session 爆滿的方法

Sessions full, service in busy, please wait..


前幾天做整合測試的時候突然遇到一個突然無法登入產品網站的問題,把程式模組單獨拉出來測試又正常,觀察測試報告後發現出現發生登入異常的時間點並不固定,而且只要發生就會連續發生一段時間,程式被中斷掉。後來確認問題在產品網站這邊,因為多個程式都要訪問主機網站導致連線數爆滿主機拒絕接受新連線,所以前端程式才會收不到資料就開始報錯中斷執行。

甚麼是 session

當我們使用端對端的網路連線服務時,例如 HTTP,伺服器端就會為建立一個會議層連線或稱之 Session 來讓雙方保持通訊正常。伺服器端會主動管理 session 數量把通訊結束跟失聯已久的 session 關掉來釋放資源給其他客戶端使用。

等待不失為好方法

雖然每個網站都可以設定連線數的上限跟規則來管理 session 數量,當然我們也可以額外建立監控程序用自己的方式來強化管理 Session 數。

一開始我就打算這麼做,想要多佔用一條連線來提早清除被那些占而不用的網站連線。當我後來發現產品最多只接受 5 個連線數後便打消了此念頭,畢竟要多佔用一個連線數對於開發與執行成本都太高了。還好又注意到主機本身清除 session 的速度還算夠快,於是改用更直覺的方式「等待」,當異常發生後我們只需要多等一段時間可以成功登入。程式碼也因此變得很精簡好懂。

# 當登入異常發生後不確定多久會恢復
# 不確定的偵測方式可以使用無窮迴圈來設計
# 在沒有遭遇例外的狀態下,迴圈只會被執行一次
while True:
# login() 函數最底層呼叫的是 request 元件
# 用 try-except 來捕捉 request 的例外
try:
# 嘗試登入
device.login()
except Exception as err:
# 登入異常發生,等上一段時間
time.sleep(delay)
continue # 繼續嘗試
break # 嘗試成功後就離開

小結

可以把網站的 session 總數類比實體銀行櫃檯,當銀行所有的櫃台都被客戶佔滿的時候,下一個客人就只能保持耐心等待前面的人完成業務離開櫃台後再遞補上去,對雙方都是最省力的做法。畢竟我還不曾遇到有銀行會特別規定每個客人臨櫃只能有多少分鐘的時間辦事,還雇用專人把超時的客人趕走的。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.