dsh-session-keepwarm

DSH 0.1.7 引入了基於引用計數的會話管理機制:主視圖切換會話時會釋放舊會話的引用,當引用計數歸零,該會話的 generation(包含本地數據、作用域 Context 和歷史窗口)會被銷燬。切回該會話時,系統會重建一個新的 generation 並重新拉取歷史記錄(至少 50 條消息),這會導致界面顯示“Loading history…”。

dsh-session-keepwarm 插件通過爲最近使用過的會話持有額外的引用,防止其被銷燬。切回這些會話時,可以直接複用內存中已加載的歷史窗口,避免重複讀取。該插件實現了一個基於 keepWarm 設置的 LRU(最近最少使用)緩存,在減少歷史重讀的同時控制內存佔用。

基本信息

  • 名稱:dsh-session-keepwarm
  • 作者:dzwalker
  • 分類:記憶
  • 許可證:MIT

核心功能

  1. 持有額外引用:爲最近使用過的會話持有額外的引用,確保其不會因爲引用計數歸零而被銷燬。
  2. 複用歷史窗口:切回已保活的會話時,複用內存中已有的歷史窗口。由於 Session.open() 對已打開會話是冪等的,因此不會再次拉取歷史。
  3. LRU 緩存:實現了一個 LRU 緩存,上限由 keepWarm 設置決定,防止無限佔用內存。
  4. 會話監控:監控 sessions.list 快照,當檢測到會話被切換到時,將其移動到 LRU 隊列頭部。
  5. 僅支持普通會話:只處理普通會話;子代理行有自己的生命週期管理,不受此插件影響。
  6. 輕量級保活:只保活客戶端本地數據和歷史流,不會啓動或持有 Host Agent。

安裝與啓用

通過以下命令安裝插件:

dsh plugin --profile web add dsh-session-keepwarm

安裝後,在對應的 profile 中啓用該插件。

配置與使用

插件的配置項定義在 session-keepwarm profile 條目下:

配置項 默認值 說明
enabled true 總開關。設爲 false 會釋放所有被保活的引用。
keepWarm 5 保活最近使用會話的數量。範圍通常爲 1 到 20。值越大,佔用瀏覽器內存越多。

適用場景與限制

  1. 僅限同標籤頁:該插件只對同一個標籤頁內的會話狀態有效。客戶端不在標籤頁或瀏覽器之間共享會話狀態(無 SharedWorker 或 BroadcastChannel),因此新窗口或新瀏覽器打開會話時仍需重新加載歷史。
  2. 首次打開仍需加載:即使會話被保活,第一次在任何標籤頁打開該會話時,仍然需要加載歷史記錄。保活隻影響“切走之後切回來”的場景。
  3. 退出條件:這是一個臨時方案。如果上游 DSH 客戶端添加了原生的“保留最近 N 個會話”設置或等價的延遲銷燬策略,應優先使用上游設置並移除此插件。

總結

dsh-session-keepwarm 通過簡單的引用計數補充,解決了 DSH 0.1.7+ 版本中會話切換時的歷史重讀問題。它適合需要頻繁在多個會話間切換以減少歷史加載延遲的用戶,但需注意其內存佔用與同標籤頁的限制。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜