想像一下你在經營一家咖啡店,門口架著一個攝影機,源源不斷拍下每個顧客的身影。這些影像就是事件流(Stream) - 一張又一張,無限播放。
但問題是,如果你想知道:
你就不能只看眼前這一張照片,而是必須保留「之前發生的事」。這個「記住歷史」的能力,就是狀態運算(Stateful Operation)。
在流處理系統中,**狀態(State)**指的是系統在處理新事件時,必須保留的歷史資訊。
狀態運算,就是依賴這些歷史資訊來完成計算的處理。
Stateless vs Stateful Processing:
Stateless:
Event1 ─→ [Process] ─→ Result1
Event2 ─→ [Process] ─→ Result2 (獨立處理,不記得 Event1)
Event3 ─→ [Process] ─→ Result3
Stateful:
Event1 ─→ [Process + State] ─→ Result1
↓
Event2 ─→ [Process + State] ─→ Result2 (記住 Event1 的資訊)
↓
Event3 ─→ [Process + State] ─→ Result3 (記住 Event1+2 的資訊)
常見的狀態運算包括:
保留一部分流 A 和流 B 的資料,等配對成功再輸出
Stream JOIN Example:
Orders Stream: [Order1] ──┐
├── [JOIN State] ── [Complete Order]
Payments Stream: [Payment1]─┘
↑
Need to store:
• Unmatched orders
• Unmatched payments
累計每個群組的統計值
Aggregation Example:
User Events ─→ [Aggregation State] ─→ User Statistics
↑
Store per user:
• Visit count
• Total spending
• Last activity
計算時間區間內的平均值、最大值、總和
Window Aggregation:
Events ─→ [Window State] ─→ Window Results
↑
Store in window:
• All events in timeframe
• Intermediate calculations
在 Streaming 系統中,狀態通常有兩種儲存方式:
Local State Store:
Stream Processor ──┬── Processing Logic
└── Local RocksDB
↓
Checkpoint to HDFS
特點:
External State Store:
Stream Processor ── Network ── Redis/Cassandra/TiKV
↑
Shared across nodes
特點:
目前以 Flink 為代表的主流 Streaming 系統,主要採用 Local State Store 方案:
方案 | 延遲 | 擴展性 | 共享性 | 容錯複雜度 | 主流使用 |
---|---|---|---|---|---|
Local Store | 低 | 中等 | 困難 | 高 | ✓ Flink 主流 |
External Store | 中等 | 高 | 容易 | 低 | 特殊場景 |
為什麼 Local Store 統一江湖?
光是把資料存在 Local State Store 還不夠,還必須解決:
持久化的實現:
RocksDB (Memory + Disk) ─── Checkpoint ──→ HDFS/S3
(定期快照)
↑ │
└────── Recovery ←──────────────────┘
(節點重啟時)
一致性的實現:
Event Processing ──→ State Update ──→ Checkpoint Barrier
│ │
└── 確保事件處理順序 ─────────────┘
低延遲存取的實現:
Hot Data (Memory) ←── RocksDB ──→ Cold Data (SSD)
↑ ↑
微秒級存取 毫秒級存取
狀態儲存是流處理從「無腦轉發」邁向「智能計算」的關鍵技術:
技術選擇:
核心機制:
有了狀態儲存,Streaming 才能真正執行 JOIN、聚合、窗口等複雜運算。
在 Day 13,我們不再把 JOIN 當成「查一次資料庫就好」的臨時補丁,而是正面踏入 Streaming JOIN 的世界。我們將透過 Join, GroupBy, Window 的實作,能更了解狀態實際的長相與實作,增進對有狀態運算的理解。
我們會以記憶體中的狀態管理為主要概念,讓你理解流處理如何用「記憶」完成有狀態運算,而不使用 RocksDB 的來當作實作講解。