首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《Streaming Systems》第五章-精确一次处理

今天的文章简单提下所谓的流计算中精确一次处理的实现。所谓精确一次处理是相对于至少一次和至多一次处理而言的,由系统保证在整个处理过程中所有数据有且仅被处理一次。

在Dataflow模型诞生以前的大多数流处理系统中只会提供至少一次和至多一次的选项。精确一次处理是一种比较理想化的情况,因为要保证精确一次处理需要从源数据侧、系统处理的shuffle过程和输出侧同时保证数据的唯一性。而Dataflow模型也承认保证实现精确一次处理是需要很多条件,例如完整性和精确性的矛盾(迟到的数据是过时丢弃导致精确性不能保证,还是一直等待导致数据累积系统崩溃或者是延迟),开发者代码充满副作用(代码里需要与外部系统交互,外部系统不能保证无论重试多少次结果都一样)。

由于源数据侧和输出侧的不可控,如今的流处理系统都着眼于系统处理本身的shuffle过程数据有且仅被处理一次,例如Spark使用RDD、Flink使用全局快照和checkpoint、Cloud Dataflow赋予数据在系统内唯一ID和重试机制。具体的实现可以阅读相关的论文(见文末的参考文章)。

当然也不能说源数据侧和输出侧真的不可控,当源数据端使用类似Kafka、文件流这种可以保证幂等性,也就是无论读取多少次都保证读的数据一样(Kafka的消息带有offset,文件本身的不可变)的系统,流处理系统就可以保证消息有且仅被处理一次,同理输出测也需要类似的特性才能保证输出的数据有且仅被处理一次。

至此对于流计算中精确一次处理的讨论告一段落,从上面地讨论中,我们可以注意到只要开发者认真的评估权衡性能、时延等各个因素,仔细设计上下流系统,在流处理系统中实现就不是不可能的。

参考文章:

  1. http://spark.apachecn.org/#/docs/paper
  2. https://arxiv.org/pdf/1506.08603.pdf
  3. 《Streaming Systems》第五章
下一篇
举报
领券