传统的流处理架构
状态放在系统外部
比如统计实时的交易额,有何问题?
有状态流处理架构
状态放在系统内部
JVM的话存储在堆外内存 or 堆内内存
那有何问题?
想要系统稳定高效运行得解决这些问题:
Flink 对状态如何处理
数据一致性
端到端的数据一致性如何实现?
如何在分布式场景下给多个拥有本地状态的运算子产生一个全域一致的快照?
状态容错
如何确保状态拥有精确一次 (exactly-once guarantee) 的容错保证?
快照操作如何实现?
更重要的是,如何在不中断运算的前提下产生快照?
checkpoint:按照周期性的全域一致快照集合。
savepoint:job 被 cancel 时,指定需要将当前全域一致快照进行存储,可以想成一个手动产生的 checkpoint,savepoint 记录着流式应用的所有运算单元的状态。
状态维护
状态如何存储和获取以及更新?
状态数据如何恢复?
状态后端存储如何选择?
通过 Flink 通过的 api 对状态进行读写
状态保存和迁移
流计算应用是无时无刻在运行,维运上有几个重要考量:
更改应用逻辑或者修bug等,如何将前一执行的状态转移到新的执行里面去?
如何重新定义任务的并发度 ?
如何升级运算集群的版本号?
Q.E.D.