分布式一致性消息傳遞、事件處理等場景中十分重要:
- At most Onece:最多一次,如果算子處理事件失敗,算子將不再嘗試該事件。
- At Least Onece:至少一次,如果算子處理事件失敗,算子會再次嘗試該處理事件,直到有一次成功。
- Exactly-Once:嚴格地,有且僅處理一次,通常有兩種方法實現:
1.分布式快照或狀態檢查點,思想就是對比檢查點和分布式快照中的狀態,如出現狀態不一致就回退到最小狀態處,重新計算。
2.At least Onece + 去重,重播失敗的算子,並刪除重復算子的結果。
從理論上看,上面這兩種機制之間存在差異,但兩者均可理解為至少一次處理外加冪等保證。上面提到的兩種機制均使用持久的后端存儲作為事實來源(Source of truth),用於保存每個操作符的狀態,並自動提交狀態更新。對於機制1(分布式快照/狀態檢查點),這個持久的后端存儲可用於保存流應用程序中全局一致的狀態檢查點(每個運算符的狀態檢查點);對於機制2(至少一次事件交付,外加去重),這個持久的后端存儲可用於保存每個運算符的狀態,以及為了追蹤哪些事件已經被成功處理過而為每個運算符生成的事務日志。
- Effectively-Onece:有效的一次或者最終一次。狀態的提交或對事實來源的持久后端進行的更新可描述為事件(Occurring)的嚴格一次。然而在計算狀態的更新 / 改動,例如所處理的事件正在針對事件執行各種用戶定義的邏輯時,如果失敗則可能進行多次,這一點正如上文所述。換句話說,事件的處理可能會進行多次,但處理的最終結果只會在持久的后端狀態存儲中體現一次。因此Streamlio認為“實際一次(Effectively-once)”可以更精確地描述這樣地處理語義。
