RePlaya: 使用 S2 Stream Storage 簡化 Session Replay
Session replay 工具對於定性使用者研究至關重要,讓開發者在定量指標提供具有統計意義的樣本之前,就能精確看到使用者在面對新功能時在哪裡遇到困難。然而,傳統的 session replay 後端通常是架構上的噩夢,需要複雜的訊息匯流排、關聯式資料庫、物件儲存與搜尋索引的協同作業,才能處理高容量的 DOM mutation 流。
RePlaya 採取了不同的做法。透過建立在 S2 之上,它將每個使用者會話(session)視為單一、僅限附加(append-only)的串流。這種架構轉變大幅減少了基礎設施的佔用,同時實現了一個在自託管替代方案中經常缺失的強大功能:對活動中會話的即時追蹤(live tailing)。
架構:將串流作為事實來源
在典型的 session replay 設定中,伺服器充當中間人,緩衝事件並將其刷新到資料庫或 blob store。RePlaya 則消除了這個中間層。使用 S2 Producer API,rrweb 事件會直接附加到會話串流的末尾。
這種設計提供了幾項技術優勢:
1. 統一的儲存與檢索
與其將元數據(metadata)拆分到資料庫,並將實際錄製內容拆分到物件儲存(如 S3)中,RePlaya 使用 S2 stream 作為整個後端。串流 就是 錄製內容。大型事件會跨多個 S2 records 進行分幀,並在播放時進行重建,這意味著不需要管理額外的 blob store。
2. 即時即時追蹤 (Real-Time Live Tailing)
由於 S2 streams 可以像寫入時一樣進行 tailing,RePlaya 可以透過 Server-Sent Events (SSE) 將新記錄橋接到瀏覽器。這讓開發者可以在訪客仍留在頁面上時,即時觀看會話,並使用與最終作為歷史錄製內容相同的串流。
3. 簡化的列表與排序
RePlaya 並非維護一個單獨的索引來追蹤會話順序,而是使用反轉時間戳(例如 sessions/<inverted timestamp>)來命名串流。由於 S2 會按字典序排列串流,簡單的 prefix list 調用即可返回最新的會話,從而無需使用關聯式資料庫來追蹤會話的時間順序。
比較:RePlaya vs. 傳統後端
| 功能 | 典型 Replay 後端 | RePlaya |
|---|---|---|
| 基礎設施 | 訊息匯流排、分析儲存、DB、物件儲存、搜尋索引 | 單一 Node server + S2 |
| 活動會話 | 在攝取/刷新延遲後進行播放 | 透過同一串流對活動會話進行即時追蹤 |
| 儲存的錄製內容 | 物件儲存中的 Blobs;DB 中的元數據 | 每個會話一個有序的 S2 stream |
| 佔用規模 | 多服務叢集(通常是 Kubernetes) | 單一程序 + S2(或自託管 s2-lite) |
實作與安全性
RePlaya 被設計為「即插即用」的錄製器。只需將一小段 JavaScript snippet 添加到目標網站,即可初始化擷取並將其指向 RePlaya host。
隱私與數據遮罩
為了應對 session recording 的固有隱私疑慮,RePlaya 預設實施遮罩功能。它使用 rrweb 的 maskAllInputs 來確保輸入、select 與 textarea 欄位中的按鍵紀錄(例如密碼與電子郵件)絕不會被傳送到伺服器。開發者可以透過將敏感的 DOM 區域包裝在 replaya-block 或 replaya-ignore 類別中,進一步精細化此功能,從而將其完全從錄製中排除。
生產環境部署
從安全性的角度來看,RePlaya 將「收集器」(面向公眾的寫入介面)與「dashboard」(私有的讀取介面)分開。建議的生產環境部署方式包括:
- 私有讀取 API: 將 dashboard 與會話檢索 API 綁定到私有介面,或將其保護在 SSO/VPN 層之後。
- 公用收集器: 僅暴露錄製器腳本與寫入端點,並透過
REPLAYA_ALLOWED_CAPTURE_ORIGINS與專案金鑰進行鎖定。 - 攝取驗證: 使用在會話建立時生成的短期附加權杖(append tokens)來授權後續的事件寫入。
倫理考量
雖然 RePlaya 的技術實作非常精簡,但 session replay 會引發重大的倫理問題。正如社群討論中所提到的,許多使用者並不知道他們的游標移動與視窗變更正被即時串流到公司的總部。這突顯了顯現的需求與使用者隱私權之間的緊張關係,建議在進行倫理部署時,可能需要透明的披露或選擇加入(opt-in)機制。
開始使用
對於想要自託管的人,RePlaya 可以透過 Docker 或直接透過 Node.js 部署。它支援 S2 Cloud 與自託管的 s2-lite 實例,適合那些希望將整個基礎設施保留在自己的邊界內的人。