如果我使用數千個 setTimeouts 會發生什麼?
P粉811349112
P粉811349112 2023-09-10 15:08:09
0
1
580

有一個透過node.js在伺服器端的網站,每次刷新頁面時它都會產生一個新程式碼,我想偵測自上次程式碼產生以來是否已經過了24小時,問題是我要做我需要弄清楚24 小時是否已經過去,如果我在用戶的IP 上使用setTimeout() ,則會出現兩個問題,第一個問題是他們可以輕鬆更改其ip 並獲取新代碼,甚至重新啟動路由器並分配新的程式碼ip,因為某些路由器帶有動態ip,第二個問題是考慮到每天甚至每小時都會有數千名用戶使用如此數量的setTimeouts 訪問網站,伺服器將因單獨為setTimeouts 分配的內存量而過載。我已經閱讀了setTimeouts 的工作原理,它們在JavaScript 編譯器中分配一些空間以在指定時間運行,因此我的堆或記憶體肯定會因此而過載,是否有更好的方法來確定24 小時是否已經過去或不是不用setTimeout() 嗎?

我嘗試尋找相同的問題,但找不到任何解決此問題的方法,我想到使用資料庫來解決此問題,但會出現另一個問題,因為我需要循環整個資料庫檢查當前時間是否為24比文件創建時間高出幾個小時,這樣的循環要么需要幾天時間才能完成,並且如果API 出現故障(我定期重新啟動它以更新內容),則會失敗

我正在嘗試找到一種解決方案,該解決方案不會使用 setTimeouts 破壞我的伺服器,如果 API 因任何原因發生故障也不會失敗,並且可以選擇能夠確定用戶是否在欺騙 ips

P粉811349112
P粉811349112

全部回覆(1)
P粉356361722

要解決您的問題,您可以結合使用伺服器端儲存和時間戳記。這是一種可能的方法:

  1. 產生新程式碼時,將其與時間戳記一起儲存在資料庫或 Redis 等持久性儲存解決方案中。

  2. 當使用者造訪網站時,從儲存中檢索最後產生的程式碼及其時間戳記。

  3. 將目前時間戳記與儲存的時間戳記進行比較,以確定自上次程式碼產生以來是否已過去 24 小時。您可以使用 JavaScript 中的 Date 物件來處理時間戳記。

  4. 如果超過 24 小時,則產生新程式碼並更新資料庫中儲存的程式碼和時間戳記。

透過使用這種方法,您可以避免大量的 setTimeout 調用,並且還無需為每個用戶循環訪問整個資料庫。相反,您只需要對每次使用者造訪的時間戳進行簡單的比較。

關於使用者欺騙 IP 的問題,完全防止 IP 欺騙具有挑戰性,因為使用者可以使用各種技術來更改其 IP 位址。但是,您可以實施額外的安全措施來最大程度地減少 IP 欺騙的影響:

  1. 實作使用者驗證:要求使用者建立帳戶並登入才能存取網站。這樣,即使他們更改了 IP,他們仍然需要有效的憑證來產生新程式碼。

  2. 實作速率限制:限制特定時間範圍內每個使用者的程式碼產生請求數量。這有助於防止濫用並減少 IP 欺騙的影響。

  3. 監控可疑活動:實作日誌記錄和監控機制來偵測可能顯示 IP 欺騙嘗試的異常模式或行為。您可以設定警報或觸發器,以便在偵測到可疑活動時通知您。

雖然這些措施無法完全消除 IP 欺騙的可能性,但它們可以使用戶更難濫用系統並減少此類嘗試的影響。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板