
50
|
第
5
章
无状态流处理
操作 操作
状态
有状态流处理
图 5-1:无状态流处理与有状态流处理的区别。输入记录由黑条表示。无状态流处
理每次只转换一条输入记录,并且仅根据最新的输入记录输出结果(白条)。有状态
流处理维护所有已处理记录的状态值,并根据每条新输入的记录更新状态,因此输
出记录(灰条)反映的是综合考虑多个事件之后的结果
尽管无状态的计算很重要,但是流处理对有状态的计算更感兴趣。事实上,
正确地实现有状态的计算比实现无状态的计算难得多。旧的流处理系统并
不支持有状态的计算,而新一代的流处理系统则将状态及其正确性视为重
中之重。
5.1
一致性
当在分布式系统中引入状态时,自然也引入了一致性问题。一致性实际上
是“正确性级别”的另一种说法,即在成功处理故障并恢复之后得到的结
果,与没有发生任何故障时得到的结果相比,前者有多正确?举例来说,
假设要对最近一小时登录的用户计数。在系统经历故障之后,计数结果是
多少?在流处理中,一致性分为
3
个级别。
• at-most-once
:这其实是没有正确性保障的委婉说法——故障发生之后,
计数结果可能丢失。
• at-least-once
:这表示计数结果可能大于正确值,但绝不会小于正确值。
也就是说,计数程序在发生故障后可能多算,但是绝不会少算。