背景與問題
Grab 的 Counter Service 是反舞弊平台裡負責時間窗口查詢的核心元件,例如判斷「最近一段時間內的叫車請求次數」或「短時間內失敗的付款嘗試次數」。這類服務的量級並不小:每秒處理數萬次查詢,每天約十億個請求,延遲表現直接影響風控判斷能否即時完成。InfoQ 於 2026 年 10 月 7 日由 Leela Kumili 發表的報導指出,Grab 最終把這項服務的儲存後端從原本的 wide-column database(寬欄位資料庫,一種以列群集方式組織資料、擅長依照時間範圍撈取連續列的 NoSQL 類型,Apache Cassandra 是常見代表)遷移到 Aerospike,一種以主記憶體為主、強調穩定低延遲的分散式鍵值儲存系統,並重新設計資料模型,讓生產環境的 P99 讀取延遲下降約 50%,磁碟佔用從約 3 TB 降到 1 TB,單節點成本下降 45% 到 50%。
原先的設計把 15 分鐘、每小時、每日三種粒度的計數各自存成獨立的列,於是每收到一個事件,就得同時發出三次平行讀取、在記憶體中做一次遞增,再以批次方式寫回,總共四次網路往返。原本的寬欄位模型藉由 clustering column(群集欄位,用來把同一時間範圍的列排序存放,讓伺服端能快速取出區間內資料的欄位設定)在時間範圍查詢上有其優勢,但多重往返疊加起來,延遲與節點負載都變成瓶頸。
遷移策略:先抽象化,再分階段切流量
Grab 並沒有直接替換儲存實作,而是先把儲存存取從 Rust 服務的業務邏輯中抽離出來,建立一層 storage facade(儲存外觀層,介於業務程式與實際儲存之間的中介介面,讓上層程式不需知道背後是哪一種資料庫),其中同時提供舊有實作、Aerospike 實作與測試用的 mock 實作,並透過組態設定切換單一後端、影子讀取(shadow reads,把正式流量同時複製一份到新後端做比對,但不影響實際回應)與分流三種模式。
上線時的流量切換是階梯式的:影子讀取比例先從 5% 逐步提高到 20%、50%,再到 100%,每一個階段都用既有的指標確認新舊後端的資料是否一致,確認 parity(結果對等)之後才把正式流量移到 Aerospike。Grab 工程主管 Daniel Lim 在 LinkedIn 上把這套做法描述為「結合雙讀寫路徑進行流量影子與資料對等驗證,再逐步遷移流量」。
資料模型與讀取路徑的重新設計
真正決定成效的是資料模型。Grab 最初評估過保留「每個時間桶一列」的做法,但 Aerospike 為每筆記錄維持約 64 位元組的主索引中繼資料;以這項服務所需的記錄數量計算,這層固定開銷會讓記錄筆數(cardinality)成為容量規劃上的重要變數。因此 Grab 改成把同一個計數器、同一粒度的所有時間桶合併成單一筆記錄,內部以依時間戳記排序的 map(對應表)存放,寫入時使用 Aerospike 的原子 map 遞增操作,並明確清除過期的項目。根據 Grab 的說法,這個改動讓記錄數量減少一個數量級以上,也連帶壓低了索引與磁碟佔用。
讀取路徑同樣改變。原本的後端在伺服端回傳依時間過濾後的分頁列,而 Aerospike 回傳的是包含 map 的整筆記錄,過濾改在客戶端進行。為了配合服務本身多鍵值的存取模式,Grab 使用 Aerospike 的 batch API,把多筆記錄操作合併成單一請求送到對應節點,減少網路往返次數;Aerospike 官方文件也說明,批次功能可以將多個記錄指令合併為對每個相關節點的一次請求。
工程波折、影響與限制
遷移過程並非一路順暢。Grab 團隊在 Aerospike 的 Rust client(以 Rust 語言撰寫、供應用程式連線 Aerospike 的函式庫)上遇到問題,包括它最初採用同步 API,以及在節點替換期間的 DNS 處理異常。團隊後來改用非同步客戶端,並與上游維護者共同處理 DNS 問題,才繼續推動上線。最終 Grab 表示整次遷移沒有發生停機,也沒有資料完整性問題。
從實務角度來看,這項改造的價值不只在於延遲數字:磁碟從 3 TB 降至 1 TB、單節點成本下降 45% 到 50%,對每天十億請求規模的服務而言是可觀的經常性支出節省;而把儲存存取抽象化,也讓後續替換或測試其他後端的成本變低。
限制同樣存在。合併成單筆大記錄後,過濾工作從伺服端移到客戶端,會把 CPU 與記憶體壓力轉嫁到服務節點,資料量持續成長時可能需要再引入分片或過期淘汰策略;每筆記錄 64 位元組的索引中繼資料開銷並未消失,只是靠減少記錄筆數來攤薄;影子驗證的有效性取決於既有指標是否涵蓋足夠的比對面向;此外,報導中的效能與成本數字來自 Grab 自身在生產環境的觀察,並非獨立基準測試,實際成果仍會隨資料分布與硬體配置而異。
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。