一次不完全相同:文章分析

引言


我决定分析一篇文章, 描述一次流式处理的一些有趣细节:一次 。 事实是,有些作者对这些术语的理解很奇怪。 本文的分析将使我们能够更深入地阐明许多细节,因为 识别不一致和奇怪之处可以使您更充分地体验概念和含义。


让我们开始吧。


分析方法


一切都很好地开始了:


在大数据领域,分布式事件流处理已成为越来越热门的话题。 著名的流处理引擎(SPE)包括Apache Storm,Apache Flink,Heron,Apache Kafka(Kafka Streams)和Apache Spark(Spark流)。 SPE的最着名和广泛讨论的功能之一是它们的处理语义,其中“完全一次”是最受欢迎的功能之一,许多SPE声称提供“仅一次”处理语义。

即,数据处理非常重要等,并且所讨论的主题恰好一次。 让我们讨论一下。


但是,围绕着“完全一次”的含义,含义和含义,以及各个SPE声称提供它时的真正含义,存在很多误解和含糊。

确实,了解它是什么非常重要。 为此,最好在冗长的推理之前给出正确的定义。 我该给谁该死的声音建议呢?


我将讨论许多流行的SPE之间“完全一次”处理语义如何不同,以及为什么“完全一次”可以更好地描述为“一次有效”

当然,发明新术语是一项重要的任务。 我自己爱这个东西。 为此,需要理由。 让我们尝试找到他。


我不会将明显的事物描述为有向处理图等。 读者可以自己阅读原始文章。 而且,对于这些细节的分析是无关紧要的。 我只给一张照片:



接下来,对语义进行描述:


  • 最多一次,即 不超过一次。 显而易见,在崩溃,网络连接中断等边界级别的情况下,很难保证这种行为。 但是对于作者而言,一切都很简单:


  • 至少一次,即 至少一次。 该方案更加复杂。 而且可以收集更多的耙:


  • 一次。 什么是一次?

即使在发生各种故障的情况下,流应用程序中的所有操作员也可以保证事件被“恰好一次”处理。

即 一次处理的保证是发生了“恰好一次”处理。


感到决心的力量? 换个说法:一次处理是指处理“一次”。 好吧,是的,它还说,如果发生故障,则应保留此保证。 但是对于分布式系统,这是显而易见的事情。 引号表明这里有问题。 在没有解释含义的情况下用引号定义是一种深思熟虑的方法的标志。


以下是如何实现这种语义的描述。 在这里,我想详细介绍一下。


通常使用两种流行的机制来实现“完全一次”的处理语义。
  1. 分布式快照/状态检查点
  2. 至少一次事件传递以及消息重复数据删除

如果第一种关于快照和检查点的机制没有引起任何疑问,除了效率等一些细节之外,那么第二种机制存在小问题,因此作者可以忽略。


出于某种原因,可以理解,处理程序只能是确定性的。 对于非确定性处理程序,通常来说,每次后续的重新启动将给出其他输出值和状态,这意味着重复数据删除将不起作用,因为 输出值将不同。 因此,一般机制将比文章中描述的复杂得多。 或者,坦率地说,这种机制是不正确的。


但是,我们转向最美味的:


真的一次就真的一次吗?



现在,让我们重新检查一下“一次”处理语义对最终用户的真正保证。 标签“恰好一次”在准确地描述一次完成时会产生误导。

据说是时候重新考虑这个概念了,因为 有一些不一致之处。


有人可能会认为“一次”是对事件处理的保证,其中流中的每个事件仅处理一次。 实际上,没有SPE可以保证一次处理。 面对任意故障,要保证每个运算符中用户定义的逻辑每个事件仅执行一次是不可能的,因为用户代码的部分执行是永远存在的可能性。

亲爱的作者,值得回顾一下现代处理器的工作原理。 处理中的每个处理器执行大量并行阶段。 此外,如果分支预测变量是错误的,则存在分支,其中处理器开始执行错误的操作。 在这种情况下,操作将回滚。 因此,即使没有发生故障,处理器也可以执行两次相同的代码!


细心的读者会立即惊叹:因为排气很重要,而不是排气的方式。 没错! 重要的是结果发生了什么,而不是实际发生的情况。 如果结果好像恰好发生了一次,则意味着它恰好发生了一次。 没有找到? 其他一切都是无关紧要的。 系统是复杂的,产生的抽象仅以某种方式产生执行的错觉。 在我们看来,代码是按指令顺序执行的,先读取,然后写入,然后是一条新指令。 但是事实并非如此,一切都更加复杂。 正确抽象的本质是保持简单且易于理解的保证的错觉,而不必每次都需要为变量分配值时深入了解。


而本文的整个问题就在于,“精确一次”是一种抽象,使您无需考虑重复和丢失的值即可构建应用程序。 即使跌倒,一切都会好起来的。 并且无需为此发明新的术语。


本文中的示例代码清楚地表明了对如何编写处理程序的理解不足:


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

邀请读者独立地重写代码,以免重复本文作者的错误。


那么,当SPE声称“完全一次”的处理语义时,它们可以保证什么呢? 如果不能保证用户逻辑只执行一次,那么什么才执行一次? 当SPE声称“完全一次”的处理语义时,他们实际上是在说,它们可以保证对SPE管理的状态的更新仅提交一次到持久的后端存储中。

用户不需要保证代码的物理执行。 知道处理器的工作原理,很容易得出结论,这是不可能的。 最主要的是逻辑执行仅执行一次,就好像根本没有失败一样。 吸引“致力于数据仓库”的概念只会加剧作者对基本事物的理解,因为 这类语义的实现无需提交。


有关更多信息,您可以简要阅读我的文章: 严格实时地一次异构竞争数据处理


换句话说,事件的处理可以发生不止一次,但是该处理的效果仅在持久后端状态存储中反映一次。

对用户而言,“耐用的后端状态存储”绝对是紫罗兰色的。 仅处理的效果很重要,即 在处理流数据的整个范围内保持一致性和输出值。 值得注意的是,对于某些任务,不需要持久的后端状态存储,最好只保证一次。


在Streamlio,我们已经决定一次有效是描述这些处理语义的最佳术语。

一个愚蠢的概念输入的典型示例:我们将为整个段落编写一些示例和冗长的参数,最后我们将添加“我们定义此概念”。 定义的准确性和清晰度引起了真正生动的情感反应。


结论


对抽象本质的误解会导致现有概念的原始含义失真,并随后从头开始创建新术语。


[1] 一次不完全相同
[2] 异构实时竞争数据处理仅一次

Source: https://habr.com/ru/post/zh-CN419935/


All Articles