
冪等寫入:
一個操作重復執行很多次,但只導致一次結果的更改,也就是說后面重復執行就不起作用了,eg: pow(e,x)求多階導還等于自己,HashMap,多次寫入key相同的鍵值對等,
但需要注意的是,也會出現中間狀態短暫的不一致,最終結果一致的情景,eg:flink的checkpoint還有流批結合做關聯模型轉換的ETL,這些不滿足強一致性,但可實作最終一致性,
事務寫入:
構建的事務對應著checkpoint,等到checkpoint真正完成的時候,才把所有對應的結果寫入sink系統中,否則可回滾、撤銷事務,
1. 預寫日志(Write-Ahead-Log,WAL):把結果資料先當狀態,提前在狀態后端中快取,然后在收到checkpoint完成的通知后,再一次性地寫入到sink系統,
- 特點:簡單易實作、可適用于任何sink系統;但由于最后資料是按批處理寫入,會存在延時;且按批寫入的時候若沒有做事務隔離,程序中發生故障恢復后就會導致重復寫入,
- 實作類:DataStream API提供了一個模板類GenericWriteAheadSink,來實作這種事務性sink,
2. 兩階段提交(Two-Phase-Commit,2PC):對于每個checkpoint,sink會讓sink系統啟動一個事務,然后將接受到的資料寫入外部sink系統,但是不提交,只是"預提交"階段,當jobmanager通知sink任務全部算子的checkpoint已經整合完成,sink任務才讓sink系統正式提交事務,實作結果的真正寫入,
- 特點:真正實作了exactly-once;資料還是流式寫入,不存在批處理的延時,且相比WAL額外開銷小;但是對sink系統要求較高,需要外部系統支持事務,適應性不是很廣泛,
- 實作類:Flink提供了TwoPhaseCommitSinkFunction介面,實作較為復雜,需配置項比較多,
整個上下游狀態一致性保證會受限于短板,根據木桶原理,端到端整體的一致性級別取決于最薄弱的那個環節,

接下來以kafka-flink-kafka為例,該組合可保證端到端的exactly-once:


注意:此場景下,kafka作為sink端需要開啟readCommit的隔離級別,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272862.html
標籤:其他
上一篇:Redis面經匯總
下一篇:Mybatis的學習筆記(一)
