Redis 8.4 XREADGROUP CLAIM:單指令合併讀取與訊息搶佔,最高提速 22.5 倍
redis.io · 2026-05-26
Redis Streams 的可靠消費模式長期需要多道指令才能處理「新訊息讀取」與「閒置訊息搶佔」兩種情境。Redis 8.4 在 XREADGROUP 指令新增 CLAIM 選項,將兩者合併為單一往返,並在大型 PEL(Pending Entry List)場景下實現最高 22.5 倍的效能提升。
舊方案的問題
在 Redis 8.4 之前,可靠消費迴圈需要三步驟:
XPENDING mystream mygroup # 查詢待處理訊息
XAUTOCLAIM mystream mygroup c1 1000 0 # 搶佔閒置訊息
XREADGROUP GROUP mygroup c1 STREAMS mystream > # 讀取新訊息
XAUTOCLAIM 以 stream ID 順序掃描 PEL,每次呼叫都需遍歷整個待處理列表,即使其中大多數訊息仍在正常處理中,導致 O(n) 掃描成本高昂。
CLAIM 選項的運作方式
新語法為:
XREADGROUP GROUP mygroup consumer1 COUNT 10 CLAIM 1000 BLOCK 0 STREAMS mystream >
CLAIM 1000 表示搶佔閒置超過 1000 ms 的訊息。指令執行順序為:先搶佔閒置訊息,再用剩餘的 COUNT 配額讀取新訊息。回傳的每筆記錄包含兩個額外欄位:閒置時間(ms)與交付次數,>0 代表搶佔訊息,0 代表新訊息。
內部實作將 PEL 資料結構從 rax 樹(依 stream ID 排序)改為按交付時間排序的雙向連結串列(嵌入於 streamNACK 結構體)。尋找閒置訊息從 O(n) 降為 O(k)(k 為實際閒置數量),更新交付時間從 O(log n) 降為 O(1)(unlink + append 至尾端)。
效能基準
| 指標 | XAUTOCLAIM | XREADGROUP CLAIM | 改善 |
|---|---|---|---|
| 平均 | 54.671 ms | 2.426 ms | 95.6% 降低 |
| P95 | 62.536 ms | 3.370 ms | 94.6% 降低 |
| P99 | 68.800 ms | 4.212 ms | 93.9% 降低 |
當 PEL 龐大但實際閒置訊息稀少時(生產環境常態),加速比例可達 22.5 倍。XREADGROUP CLAIM 與 BLOCK 模式結合後,封鎖等待能同時監聽新訊息到達與訊息閒置超時兩種喚醒條件,進一步降低不必要的輪詢。
原始來源:redis.io
ClickHouse 整合 Rust Delta Kernel:Delta Lake 讀寫、時間旅行與 Schema 演進
clickhouse.com · 2026-05-22
ClickHouse 透過整合由 Delta.io 維護的官方 Rust Delta Kernel 函式庫,原生支援 Delta Lake 表格格式的讀取、寫入、schema 演進及時間旅行查詢,無需每個查詢引擎各自實作 Delta Lake 協議解析邏輯。
Delta Kernel 的職責邊界
Delta Kernel 負責:解析 JSON 格式的交易日誌(transaction log)、解讀 Delta 元資料(metadata)、解析快照並決定正確的資料檔案集合,以及基於元資料的資料跳過(data skipping)。查詢引擎保留對效能關鍵路徑的控制:實際的 Parquet 檔案讀取、網路 I/O 及向量化執行。
Rust-C++ 整合的技術挑戰
ClickHouse 要求零外部執行時依賴(僅允許 libc),所有依賴以子模組形式納入 contrib/ 並靜態編譯,且須通過 ASAN/MSAN/TSAN/UBSAN 等 sanitizer。整合過程解決的主要問題包括:
- 工作區隔離:修改 Corrosion(CMake-Rust 橋接工具)以防止多個 Rust workspace 間的 sccache 衝突。
- OpenSSL 靜態連結:確保 Rust 程式碼連結 ClickHouse 自有的 OpenSSL,而非系統函式庫。
- 跨編譯限制:僅建置
staticlib,避免引用不可用的系統函式庫符號。
由於 ring 依賴的 SIMD 假設與 ARM 指令集處理有衝突,Memory sanitizer 建置目前停用。
已啟用功能
- ACID 寫入:ClickHouse 寫入 Parquet 檔案,Kernel 管理交易日誌,確保一致性。
- Schema 演進:Kernel 區分邏輯 schema(使用者視角)與物理 schema(檔案層),自動處理欄位新增等演進情境。
- 時間旅行:透過
delta_lake_snapshot_start_version/delta_lake_snapshot_end_version設定查詢歷史快照,Change Data Feed(CDF)記錄版本化的插入、更新與刪除事件。 - 分區與統計資料裁剪:基於元資料跳過不相關的資料檔案,降低 I/O。
目前尚不支援從 ClickHouse 直接建立空的 Delta 表(初始化流程),此為後續開發重點。
原始來源:clickhouse.com