分布式事件处理现在已经逐渐成为大数据领域的热点话题,主要使用的流处理引擎包括Storm、Flink、Spark(Spark Streaming)、HERON等等。其中“严格一次(Exactly-once)”是很多引擎追求的目标之一,很多引擎宣称可以提供“严格一次”的处理语义。

但是“严格一次”具体指的是什么,需要具备哪些能力,当SPE宣称可以支持时这实际上意味着什么对于这些问题还有很多歧义和误导。使用“严格一次”来描述处理语义本身就会造成很多语义上的误导。本文主要讨论各个引擎在“严格一次”处理语义方面的差异,“严格一次”为什么更适合称之为“Effectively-once”,以及各类常用技术之间要进行的取舍。

背景

流处理也被称为事件处理,简单说就是指持续不断地处理一系列无穷无尽的数据或事件的过程。流处理或事件处理应用程序大致可以看做是一种有向图,大部分情况也可以看做是DAG。图中每一个边缘代表一个数据或事件流,每个顶点代表使用应用程序定义的逻辑处理来自相邻边缘的数据或事件的运算符。两种特殊类型的顶点:通常称之为Source和Sink,Source会消耗外部数据/时间并将其注入应用程序而Sink通常负责收集应用程序生成的结果。下图展示了一个 典型的Heron处理拓扑:

执行流/事件处理应用程序的SPE通常可供用户指定可靠性模式或处理语义,代表了在跨越整个应用程序图处理数据时所能提供的保证。保证是有一定意义的,可以假设由于网络、计算机等原因遇到失败而导致数据丢失的概率。在描述SPE可以为应用程序提供的数据处理语义时,通常会有三种模式:最多一次(At-most-once)、最少一次(At-least-once)、以及严格一次(Exactly-once)

最多一次

其实是一种“尽力而为”的方法。数据或事件可以保证被应用程序中的所有运算符最多处理一次。意味着如果在流应用程序最终成功处理之前就已经丢失,则不会额外试图重试或重新传输事件。

最少一次

数据或事件可以保证被应用程序图中的所有运算符最少处理一次。通常意味着如果在流应用程序最终成功处理之前就已丢失,那么事件将从来源重播或重新传输。然而因为可以重新传输,有时一个事件可能被多次处理因此这种方式被称之为“最少一次”。下面的例子中第一个运算符最初处理事件时失败了,随后重试并成功,随后再次重试并再次成功,然后再次重试实际上不必要的。

严格一次

事件保证被流应用程序中的所有运算符“严格一次”处理,即使遇到失败。

为了实现“严格一次”处理语义,通常主要会使用下列两种机制:

  1. 分布式快照/状态检查点
  2. 最少一次事件交付,外加消息去重

通过分布式快照/状态检查点方法实现的“严格一次”是由Chandy-Lamport分布式快照算法启发而来的。在这种机制中会定期为流应用程序中每个运算符的所有状态创建检查点,一旦系统中任何位置出现失败,每个运算符的所有状态会回滚至最新的全局一致检查点,回滚过程中所有处理工作会暂停。随后源也会重置为与最新检查点相符的偏移量整个应用程序基本上会被“倒带”到最新一致状态,并从该状态开始重置处理,下图中展示了这种机制的一些基本概念:

上图中流应用程序在T1时候正在正常运行,并创建了状态检查点。但是在T2时候运算符在处理传入的数据时失败了,此时S=4这个状态值已经被保存到持久存储中而S=12状态值正位于运算符的内存中。为了调和这种矛盾,在T3时候处理图将状态回退至S=4,并“重播”流中直至最新状态前每个连续的状态并处理了每个数据。最终结果是有些数据被处理了但是这也没有问题,因为无论回滚多少次结果状态都是相同的。

实现“严格一次”另一种方法是实现至少一次事件交付同时在每个运算符一端进行事件去重,使用这种方法的SPE会重播失败的事件并再次尝试处理并从每个运算符中移除重复的事件,随后才将结果时间发送给用户在运算符中定义的逻辑。这种机制要求为每个运算符保存事务日志,借此才能追踪哪些事件已经处理过了。为此 SPE 通常会使用诸如 Google 的 MillWheel等机制。

分布式快照与至少一次事件交付外加去重机制的对比

从语义角度来看,分布式快照以及至少一次事件交付外加去重。这两种机制可以提供相同的保证,然而由于两种机制在实现方面的差异可能会对性能产生巨大的影响。

基于分布式快照/状态检查点的SPE在性能方面开销可能是最低的,基本SPE只需要在通过流应用程序照常处理事件的过程之外发送少量特殊事件,而状态检查点操作可以在后台以异步的方式进行,但是对于大型流应用程序失败的概率将会更高。这会导致SPE需要暂停应用程序并回滚所有操作符的状态这样会对性能产生影响。流应用程序规模越大遇到失败的频率就会越高因此性能方面受到的影响也会越大,然而需要再次提醒的是,这种机制是非侵入式的,只会对资源的使用造成少量的影响。

至少一次事件交付外加去重机制可能需要更多的资源尤其是存储资源。在这种机制中,SPE需要追踪已经被运算符的每个实例成功处理的每个元组,借此才能执行去重并实现自身在每个事件中的去重。这可能需要追踪非常大量的数据,尤其是当流应用程序规模非常大,或运行了很多应用程序的时候。每个运算符中的每个事件执行去重操作,这本身也会产生巨大的性能开销。然而对于这种机制,流应用程序的性能不太可能受到应用程序规模的影响。对于分布式快照/状态检查点机制,如果任何运算符遇到任何失败,均需要全局暂停并状态回滚;对于至少一次事件交付外加去重机制,失败只能影响到局部。如果某个运算符遇到失败,只需要从上游来源重播 / 重新传输尚未成功处理的事件,对性能的影响可隔离在流应用程序中实际发生失败的地方,只会对流应用程序中其他运算符的性能产生最少量的影响。从性能的角度来看,两种机制各有利弊,具体情况可参阅下文表格。

流式处理术语解释:Exactly-once与Effectively-once相关推荐

  1. 流式处理 术语解释 Exactly-once与Effectively-once

    分布式事件流处理已逐渐成为大数据领域的热点话题.该领域主要的流处理引擎(SPE)包括 Apache Storm.Apache Flink.Heron.Apache Kafka(Kafka Stream ...

  2. 完美解释:wenet-流式与非流式语音识别统一模型

    Unified Streaming and Non-streaming Two-pass End-to-end Model for Speech Recognition[1] ,本文以该篇论文为主线, ...

  3. 大数据凉了?No,流式计算浪潮才刚刚开始!

    AI 前线导读:本文重点讨论了大数据系统发展的历史轨迹,行文轻松活泼,内容通俗易懂,是一篇茶余饭后用来作为大数据谈资的不严肃说明文.本文翻译自<Streaming System>最后一章& ...

  4. 编程范式:函数式编程防御式编程响应式编程契约式编程流式编程

    不长的编码生涯,看到无数概念和词汇:面向对象编程.过程式编程.指令式编程.函数式编程.防御式编程.流式编程.响应式编程.契约式编程.进攻式编程.声明式编程--有种生无可恋的感觉. 本文试图加以汇总和整 ...

  5. 物流仓储行业专业术语解释

    一.五大管理系统 OMS 订单管理系统(Order Management System)是对客户下达的订单进行管理及跟踪,同时把处理后的订单指令通过EDI接口传送至仓储管理系统(WMS)或车辆调度系统 ...

  6. Flink系列之Flink流式计算引擎基础理论

    声明:         文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除.感谢.转载请注明出处,感谢. By luoye ...

  7. 网络存储设备磁带机术语解释

    ​​​​​​1.存储容量 存储容量是指在数据未被压缩前磁带机所能存储的最大数据量.这个数值取决于两个因素,一是单盒磁带的存储容量,二是磁带机所能容纳的磁带数目.由于磁带机采用多种不同的备份技术所以存储 ...

  8. 小白学习Flink系列--第二篇-01(流式数据概念)

    导读 要想彻底理解Flink,就要了解流数据的前世今生,流数据的语义.特点,以及如何处理,以下文章就能很好的解释流数据的概念和模型,对了解Flink有很大的帮助 前言 今天流式数据处理在大数据领域是一 ...

  9. java 数据库 流式查询_关于mybatis:强大MyBatis-三种流式查询方法

    基本概念 流式查问指的是查问胜利后不是返回一个汇合而是返回一个迭代器,利用每次从迭代器取一条查问后果.流式查问的益处是可能升高内存应用. [腾讯云]云产品限时秒杀,爆款1核2G云服务器,首年99元 如 ...

  10. 基于流式的md5计算-多线程下载工具Lwget介绍

    在数据传输的时候,我们希望实现以下目标: 1. 使用多线程传输,加速下载速度 2. 数据在传输过程中,进行流式md5计算,避免在传输完毕之后校验大文件 3. 支持断点续传 4. 支持http协议和ft ...

最新文章

  1. 一步步写STM32 OS【二】环境搭建
  2. python 路径往上一层_Python常用模块之模块、包介绍和相关语法
  3. 数据库---查询(详细)
  4. 旅途的意义- 献给二十五岁
  5. canvas笔记-lineCap的使用
  6. mysql innoback_innobackex工具备份mysql数据
  7. 小白学Java Web 3 Web前端之CSS基本知识2
  8. sql面试题sql语句_第二轮SQL面试问题
  9. URLDecoder: Incomplete trailing escape (%) pattern
  10. 傲腾内存安装问题分享
  11. 微信小程序的测试方法
  12. 小米6怎么刷入鸿蒙,小米6成功刷入统信UOS系统 刷机包开放下载
  13. 电脑开机后过一会就关机自动重启
  14. 愿岁月流成花海,你我结伴而行
  15. 学习金字塔——谈谈对学习的一点理解
  16. Cobalt Strike Aggressor Script
  17. 微信小程序 18 播放记录和video页面初步搭建
  18. 浏览器主页被劫持 解决方法
  19. 京东联盟 很抱歉,账号无可用认证方式 的解决
  20. 天使湖北武汉汇美是骗子T

热门文章

  1. 接口返回数据带横杠时的正确写法
  2. Redis集群cluster:增加删除(伸缩)节点操作步骤
  3. 三角(Triangle)
  4. onTouchEvent事件不敏感
  5. java 定时取出一段时间,Java 实现定时任务的三种方法
  6. 英语五种基本句型判断
  7. 计算机桌面图标变大怎么解决,小编教你电脑桌面图标变大了怎么办
  8. getrusage-进程资源统计函数
  9. IE编程1(.net)——读取IE窗口信息
  10. 原生app签名如何转换成快应用签名