Flink 描述中第一个词就是 Stateful,为什么「状态」如此重要?
流的状态区分
“状态”可以分为两类,一类是流数据状态,另一类是流信息状态。
- 流数据状态。处理时的临时缓存,计算完成后就清理掉。
- 流信息状态。计算得到的信息会在后续被继续使用,从而需要将它们保存下来。同时在之后的流计算过程中,这些信息还会被不断地查询和更新。
流数据状态
流信息状态
“流信息状态”最主要的功能,是记录在流计算过程中分析出的业务信息。
流信息状态的存储,通常是依赖于数据库完成的。这有三方面的原因。
一是,“流信息状态”通常需要保存较长时间,数据量也不小,还需要频繁查询和更新,将它存放在数据库中,能方便地长期保存和增删查改。
二是,“流信息状态”存在“数据变冷”和“过期淘汰”的问题,使用数据库的“热数据缓存”和“TTL 机制”,能方便有效地解决这两个问题。
三是,“流信息状态”通常数据量会很大,单个存储节点往往是不够用的,选择合适的数据库能够方便地扩展为集群。
使用 Apache Ignite 存储流信息状态。
如何区别
我目前理解主要是看需求。即计算周期和统计周期的差距
- 如果差距较大,如每10s计算一次过去7天的总和,那就用流信息状态
- 如果差距较小,如每10s计算过去1小时的总和,那就用流数据状态