資料與儲存 2026 年 5 月 27 日

2026-05-27 — Redis 8.4 XREADGROUP CLAIM 單指令消費、ClickHouse 整合 Rust Delta Kernel

primary=https://redis.io/en/blog/single-shot-reliable-consumers-with-xreadgroup-claim-in-redis-84/ primary=https://clickhouse.com/blog/integrating-rust-delta-kernel

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 至尾端)。

效能基準

指標XAUTOCLAIMXREADGROUP CLAIM改善
平均54.671 ms2.426 ms95.6% 降低
P9562.536 ms3.370 ms94.6% 降低
P9968.800 ms4.212 ms93.9% 降低

當 PEL 龐大但實際閒置訊息稀少時(生產環境常態),加速比例可達 22.5 倍XREADGROUP CLAIMBLOCK 模式結合後,封鎖等待能同時監聽新訊息到達與訊息閒置超時兩種喚醒條件,進一步降低不必要的輪詢。

原始來源: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


End of article
0
Would love your thoughts, please comment.x
()
x