At most once

数据被保证只会被应用中的算子最多处理一次,但数据可能丢失。

At least once

数据被保证被应用中的算子至少处理一次,即事件在应用处理之前丢失的话会被从source重放(replayed)或重传(retransmitted)。所以事件可能会被处理多次。

Exactly once

即时发生各种故障,事件或数据也被保证只会被应用程序处理一次。

机制

checkpoint

流处理应用中的每个算子都会周期性地做checkpoint保存状态,如果发生故障,每个算子的所有状态都会回滚到最近的全局一致的checkpoint处。回滚时所有程序都会暂停,Source也会根据最近的checkpoint重置到正确的偏移量上。简而言之就是整个流处理应用倒回到最近一次的一致性状态重新开始处理。

checkpoint的内容

checkpoint中包含当前程序的状态source输入流消费的位置。Flink定期将checkpoint写到一个持久化存储上,这个过程是异步的。

恢复流程

流处理应用在T1时正常工作并做了checkpoint(S=4),在T2的时候失败了,接下来会暂停程序,整个流处理应用回滚到T1做的checkpoint上。上游的Source重新放置数据,下游从S=4的状态开始处理。
这个流程中虽然有的数据会被处理多次,但无论多少次最终结果都是一样的。

At-least-once+下游去重

这种机制下,如果失败了Source会重放之前的事件/数据,下游在处理之前要对数据进行去重,才能保证数据只被计算一次。

两种机制的对比

两种机制都可以被简化为至少一次处理+幂等性,各自的优缺点如下:

checkpoint:

  • 优点: 较小的性能和资源开销

    • 因为做checkpoint是后台异步执行的。而在At-least-once+下游去重中,不管是常规的数据还是特殊的数据都是一起发送的,下游需要处理这两种数据,对两种数据进行去重
  • 缺点: 拓扑越大,对性能的潜在影响就越大
    • 流式应用越大,发生故障的可能性就越高,每次故障都需要整个流式应用从最新一次全局一致的checkpoint启动,这反过来会影响处理的性能

At-least-once+下游去重:

  • 优点: 故障对性能的影响是局部的,故障的影响不会随着拓扑的大小而增加

    • 发生故障时只需从故障的局部恢复即可(可能尚未完全处理的事件仅从上游源重放/重传),对流式应用的其他算子几乎没有影响
  • 缺点: 去重可能需要大量的存储和计算资源来支持
    • 执行重复数据删除的每个算子上的每个事件都会产生性能开销

到底是什么Exactly Once?

从上面的恢复流程可以看出,当引擎声明Exactly Once的语义时,并不一定能保证每条数据只被用户自定义的逻辑处理一次,因为用户代码可能被部分执行(Partial execution)。

Map (Event event) {Print "Event ID: " + event.getId()Return event
}

如果每条数据只被用户代码精确地执行一次,那么上面代码打印的ID应该是不重复的。但是,这是无法保证的,因为在用户定义的逻辑的执行过程中,随时都可能发生故障。引擎无法自行确定执行用户定义的处理逻辑的时间点。因此,不能保证任意用户定义的逻辑只执行一次。这也意味着,在用户定义的逻辑中实现的外部操作(如写数据库)也不能保证只执行一次。此类操作仍然需要以幂等的方式执行。

当引擎声明Exactly Once的语义时,实际上是在说:它们可以保证引擎管理的状态更新只提交一次到持久化的后端状态
在checkpoint机制下,持久化的后端状态用来保存全局一致性checkpoint,在At-least-once+下游去重机制下,持久化的后端状态用于存储算子状态和算子的事务日志,日志记录了它处理过的所有事件,可以用来去重。

不管是哪种机制,数据都可能被用户自定义代码处理不止一次,但处理的效果反映在状态后端上却只有一次,因此把「精确一次」(Exactly Once)称为「有效一次」(Effectively Once)或许更加准确。

Exactly Once,究竟是对什么Exactly Once?相关推荐

  1. python究竟要不要使用多线程

    阅读目录 1. 先来看两个例子 2. python虚拟机机制如何控制代码执行? 3. python多线程究竟有没有用? 4. python多进程执行原理 在总结concurrent.futures库之 ...

  2. 数据科学究竟是什么?

    数据科学是一门将数据变得有用的学科.它包含三个重要概念: 统计 机器学习 数据挖掘/分析 数据科学的定义 如果你回顾一下数据科学这个术语的[早期历史](),会发现有两个主题密切相连: 大数据意味着计算 ...

  3. 都说区块链颠覆未来,区块链究竟能改变什么?

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链,有时像个天使,有时像个魔鬼. 有人说它是金融泡沫,说他是彻底的庞氏骗局:有人说它能改变世界,有人认为区块链的可以 ...

  4. 区块链热度不断,那么究竟是泡沫还是未来?

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链究竟是泡沫还是未来,需要落脚到实际运用中去判断.区块链区别于传统服务器,其宗旨不是为现实世界带来某个特定的产品,而 ...

  5. Python中的类、模块和包究竟是什么?

    Python培训教程:Python中的类.模块和包究竟是什么?在Python和其他编程语言中,都有类似或相同的概念,如对象.类.模块.包,名称都是一样的,只不过会有细微的一些区别,正是因为有这些存在, ...

  6. Java培训教程:”==“和 equals 方法究竟有什么区别?

    在学习java技术过程中,我们会接触到一些变量值的相关知识,本期小编为大家介绍的教程就是关于"=="和 equals 方法究竟有什么区别?来看看下面的详细介绍. Java培训教程: ...

  7. 程序员敲代码时,戴着耳机究竟在听什么?

    今天,某妹子突然凑到我的耳边轻声说:"我们公司的程序员,清一色的戴着耳机,你说他们是不是故意不想听我们提的需求?" 我很方,因为我也喜欢戴耳机. (思考ing) 思考了一秒钟后,一 ...

  8. 00后当道,今秋开学的AI专业的本科生究竟学什么?

    500万AI人才缺口,必须从本科抓起!正值开学季,不少同学在刚刚过去的夏天,选择了心仪的专业,即将迈入大学校门.上个月,清华.南大.西交大等26所高校联合申请设立AI本科专业,国内第一批AI本科大学生 ...

  9. 科普:进入内核态究竟是什么意思?

    欢迎关注方志朋的博客,回复"666"获面试宝典 太长不想看的直接看总结: 内核态,或者说CPU的特权模式,是CPU的一种工作状态,它影响CPU对不同指令的执行结果.操作系统通过跟C ...

  10. Java微服务 vs Go微服务,究竟谁更强!?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 Java微服务能像Go微服务一样快吗?这是我最近一直 ...

最新文章

  1. 日访问量百亿级的应用如何做缓存架构设计
  2. spring书籍调研
  3. Bootstrap 支持的设备类型
  4. sql语句中 and 与or 的优先级
  5. 用NAnt 将StarTeam中的文件CheckOut回本地计算机
  6. 数据库开发文档记录方法
  7. 卡饭里的云计算机,微云可以在电脑用吗
  8. 顺序锁(seqlock)
  9. 外行人都能看得懂的机器学习,错过了血亏!
  10. 14届数独-真题标准数独-Day 7-20220122
  11. 上计算机课应该有的表现,计算机应用基础学习过程表现
  12. html文件关联异常怎么修复,在Win7系统中,如何修复exe文件关联错误?
  13. 获取list中出现频数最多的元素
  14. Word-VBA:删除选择区域的项目符号
  15. 用python画动态皮卡丘_如何利用python绘制可爱皮卡丘?
  16. 金融工程及其python应用pdf_金融工程及其Python应用
  17. 好吃易做的简单菜谱家常菜做法
  18. git的pull和push操作
  19. 老股民箱底翻出发黄纸质股票 如今价值超过20万
  20. 批量替换一个文件中的文件名,例如将文件夹中s**_abnormal.jpg文件修改为s**_abnor.jpg

热门文章

  1. MFC编程中UpdateData(true)和UpdateData(false)的区别
  2. python代码检测工具及区别_flake8-python代码质量检测工具
  3. C语言正则表达式库RegEx库
  4. 非线性视频剪辑软件 MAGIX Video Pro X11 v17.0.1.27 特别版
  5. 微信公众号、普通网页关闭当前页面
  6. 【测试入门】测试用例经典设计方法 —— 因果图法
  7. vmware esxi安装centos7系统操作步骤
  8. JMeter之响应断言
  9. CrownCAD(皇冠CAD)参数化设计:如何灵活应用“变量”,快速实现模型的参数化设计与迭代?
  10. Github Host地址查询