状态
无状态的计算:观察每个独立事件,根据最后一个输出结果。
有状态的计算:更新状态,基于多个事件输出结果。
一致性
指故障处理后的数据正确性。
at-most-once:数据可能丢失,没有正确性保证。
at-least-once:计算可能多算,但是决不会少算。
exactly-once:故障后能保证正确性。
检查点:保证exactly-once
checkpoint,确保状态正确使用。核心在于检查点屏障(checkpoint barrier)的使用。
l ckpt就是检查点屏障。与普通记录一样,但是会触发检查点机制。
l 遇到ckpt时就将其在流中的位置保存至稳定存储。
l 在实际处理ckpt时,将当前的结果(状态)保存至稳定存储中。
l 出错时,根据位置还原数据流,根据结果还原状态。之后重播消息。
l 输出流可能会因为还原而含有重复数据。
除此之外还有一个保存点(savepoint)系统,原理与检查点相同,但是可以用户手动触发。检查点是自动保存的。
端到端的一致性
在流计算时一致性由检查点保证。但是从结果到输出存储系统中要如何保证exactly-once呢?
1. 在流计算的最后一个环节缓存全部结果,最后一起输出。(已提交读)
2. 立刻输出,但是发生错误就回滚。(未提交读)
某些情况下,可以直接读取状态而不存储再读取。