瀏覽器節(jié)能機制導(dǎo)致Websocket斷連的坑
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
序言你踩過嗎?瀏覽器節(jié)能機制導(dǎo)致Websocket斷連的坑~~~ 近期,在使用 最終發(fā)現(xiàn)問題的根本原因:正是瀏覽器的節(jié)能機制,不經(jīng)意間成為了這一問題的幕后黑手。 瀏覽器節(jié)能機制簡介瀏覽器的節(jié)能機制逐漸成為前端開發(fā)者需要關(guān)注的問題。特別是這些節(jié)能機制可能會對定時器的精度產(chǎn)生影響,這直接關(guān)系到前端應(yīng)用的用戶體驗,在某些場景下甚至影響到用戶的使用。 為了減少電能消耗,提高電池續(xù)航能力,現(xiàn)代瀏覽器都引入了節(jié)能機制。這些機制包括但不限于降低空閑標簽頁的 WS頻繁斷連原因分析查閱socket.io官網(wǎng)[1]服務(wù)端配置的 WS連接中服務(wù)端和客戶端兩端必須一直保持心跳。如果有一端停止,則滿足如下條件之一就會自動斷連:
看文檔發(fā)現(xiàn)其實高版本的socket.io是由服務(wù)端定時發(fā)起ping。而在socket.io 2.X的版本中內(nèi)置的心跳機制是由客戶端定時發(fā)起。而瀏覽器在后臺運行時,即使你設(shè)置了一個每秒觸發(fā)的定時器,它也只能每分鐘觸發(fā)一次,超過了 WS頻繁斷連解決方法@升級socket.io到最新版本上面的截圖其實就是最新版本(4.x)的,升級后由服務(wù)器定時發(fā)起心跳。在服務(wù)端定時運行,避開了瀏覽器節(jié)能機制對定時器的影響 @自定義WS心跳事件為了減小直接升級對已有業(yè)務(wù)的影響,目前使用的也是這種方案:在服務(wù)端自定義心跳事件,定時發(fā)送心跳custom-ping
注意:斷連時一定要銷毀定時器 其實,socket.io是有內(nèi)置心跳的(2.x版本客戶端定時發(fā)起,4.x由服務(wù)端定時發(fā)起),自定義心跳的意義主要在于保持數(shù)據(jù)交換,在這個時間間隔內(nèi)保持數(shù)據(jù)交換,socket就不會自動中斷重連。 @使用setTimeout這里要注意使用setTimeout的姿勢,如果是直接這樣使用、依然會有精度問題。
在setTimeout里面去執(zhí)行一個函數(shù)棧會被瀏覽器監(jiān)控到,會認為和setInterval一樣,其在后臺運行時會降低其定時精度。 但如果這樣可以避開節(jié)能機制的限制:
@使用Web-Workers在Web-Workers線程內(nèi)發(fā)起定時不受瀏覽器節(jié)能機制的限制,相關(guān)示例在這篇文章里也有介紹《掌握Web Workers:徹底解鎖前端多線程編程的潛力》[3] @頁面?;睿▽崪y無效)在后臺運行時也保持瀏覽器的活躍,用得最多的方式是在頁面隱藏一個循環(huán)播放的音頻 或者 使用
實測,使用這種方式時,瀏覽器在后臺運行仍然存在定時器精度降低的問題。 小結(jié)WS頻繁斷連的原因:
總結(jié)隨著瀏覽器技術(shù)的發(fā)展,節(jié)能機制無疑會越來越完善,但與此同時也給前端開發(fā)帶來了新的挑戰(zhàn)。了解和適應(yīng)這些變化,采用正確的策略來解決由此引起的問題,對于開發(fā)高質(zhì)量的前端應(yīng)用至關(guān)重要。通過上述方法,我們可以有效地緩解或解決瀏覽器節(jié)能機制對定時器精度降低帶來的影響,從而提升用戶體驗。 參考資料https://socket.io/zh-CN/docs/v4/server-options/#pinginterval: https://socket.io/zh-CN/docs/v4/server-options/#pinginterval https://juejin.cn/post/7360890308845404200: https://juejin.cn/post/7360890308845404200 https://juejin.cn/post/7360890308845404200: https://juejin.cn/post/7360890308845404200 該文章在 2024/5/7 17:20:56 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |