"Firestore"
- 從 Firestore 遷往自建 relational:撞牆驅動的 paradigm shift 重建模、存取模型反轉與並行期
Firestore → 自建後端 + relational 不是匯資料而是反轉存取模型:client 直連變 API 中介、Security Rules 授權變後端授權、document 反正規化變正規 schema、realtime listener 與 offline 同步要重建;涵蓋為何只搬資料的遷移不成立、哪些能力該遷哪些先留在平台、dual-write + shadow read 的階段化與遷出代價判讀
- Firestore Security Rules 授權建模與可測試化:把規則當程式碼治理
Firestore client 直連模型把整個授權控制面壓在 Security Rules 這套 DSL 裡;本文展開規則的求值模型、把授權拆成可組合 function、用 emulator 寫單元測試、把規則寫成資安漏洞的 production 事故(`if true` 上線沒收、`read` 沒拆 `get` 與 `list`、寫入內容沒驗證、遞迴萬用 `match` 蓋掉嚴格規則、規則複雜到沒人能 review),以及規則複雜度撞牆時把授權拉回後端的邊界
- Firestore 高頻寫入與 distributed counter:單 document contention 邊界與分片計數
Firestore 單一 document 有持續寫入的軟上限、高頻計數寫爆 contention 是常見事故;本文展開寫入 contention 的成因、distributed counter 分片計數的實作與讀取彙總、shard 數量與讀寫成本的取捨、高頻寫入事故(直接 increment 單一 document、shard 數估太少或太多、選 shard 有偏、把分片計數當強一致餘額用),以及計數需求超過分片能處理時改走外部聚合的邊界
- Firestore document 反正規化與一致性維護:fan-out write、副本同步與資料修復
Firestore 沒有 JOIN,查詢能力逼著把關聯資料反正規化複製多份;本文展開反正規化的建模決策、fan-out write 維護副本一致、batch 與 transaction 的選擇、副本不一致的 production 事故(複製了卻沒建 fan-out 路徑、同步 fan-out 撞到副本數上限、fan-out 中途失敗、雙向副本互相觸發成環、拿副本做權限判斷),以及反正規化複雜到該回關聯式的邊界
- Firestore realtime listener 扇出與成本:snapshot 訂閱、re-read 計費與連線規模
Firestore 的 snapshot listener 提供即時同步、但訂閱的扇出、查詢結果變動的 re-read 計費與連線數會在規模下變成成本與效能瓶頸;本文展開 listener 的推送模型、訂閱範圍設計、realtime 成本事故(把不需即時的列表做成 listener、忘記取消訂閱、訂閱寬 query、每次推送重畫整個列表、高扇出直接訂閱原始資料),以及即時需求超過 listener 該換推送架構的邊界
- Firestore Distributed Counter Lab
在 emulator 上實作 distributed counter:建立 N 個 shard、隨機分片寫入、觀察 shard 分佈是否均勻、讀取彙總驗證總和正確,並說明 contention 本身是 emulator 不模擬的 production 特性
- Firestore Local Emulator Quickstart
用 Firebase CLI 啟動 Firestore emulator、寫 firestore.rules、用 admin SDK seed 資料、跑 query baseline 與 cleanup,建立後續 Security Rules 與 distributed counter lab 共用的本地環境
- Firestore Security Rules Test Lab
用 @firebase/rules-unit-testing 在 emulator 上把 Security Rules 寫成自動化測試:放行 / 越權拒絕 / 未登入拒絕 / 欄位竄改拒絕四類斷言、firebase emulators:exec 在 CI 跑、把規則測試接進 release gate