一个可自由的增量和流媒体系统地图

2021-05-05 20:39:41

免责声明:我曾经努力实现这一帖子中的系统之一。

这是我们不具有明确术语的系统的一个系统。核心它们的核心想法是:

我们希望以更好的方式计算新的输出(延迟,较低的吞吐量,较低的资源使用等),而不仅仅是从头开始运行函数。

有问题的函数可以是从简单的预算计算(输入=银行事务,输出=剩余余额)到整个网站的任何功能(输入=用户操作,输出= HTML)。

这些系统中的大多数都是同样富有表现力的并且可以互相呈现,因此表征它们的最有用方式是它们处理的工作负载,特别是它们处理的工作负载优于反复运行合理的批量系统。

这类似于我们如何将SQL数据库描述为OLTP,OLAP,时间序列等以及使用广泛实施的,良好的基准套件如TPC测试这些特征。遗憾的是,没有这样的套件,增量/流系统,甚至甚至存在的基准通常都是不暗示的。

目前,我们可以通过设计选择来组织它们,然后在年后面的时间' LL测试这些设计选择如何影响他们可以处理的工作负载范围。

任何增量系统都必须跟踪计算的依赖关系图,以便在输入更改时重用其部分。非结构化系统允许完全任意图形,其中每个节点是计算中的单个值,每个边沿都是一些任意操作。在结构化系统中,每个节点是一个值的集合,图表中的边缘限制为系统可以有效地传播对集合的一些操作。

非结构化系统的主要优点是它们允许进行规则的代码增量(因此他们在UI中的普及),而结构化系统需要重写代码对某些受限接口。

缺点是,非结构化系统倾向于控制增量计算的粒度。使每个节点中的值太大,您可以执行大量不必要的重新计算。使它们太小,图表元数据的开销主导了实际计算。增量最终结束了增长半结构性延伸,以处理这些问题。国家管理库的无穷无尽的反应似乎是这种难题的症状,在寻找映射状态变化的正确粒度难以改变UI。

由于降低的元数据开销以及利用其有限运营商集的代数特性的能力,结构化系统能够扩展到更大的计算和更精细的变化。他们通常更容易到自动并行化,因为可以使工作的粒度更小 - 它比岩石更容易包装沙子。

构建系统A LACALE和朝向统一的反应UI理论提供了非结构化系统中最先进的良好概述。我赢了'在这里进一步讨论它们。

(非常紧密的轴是值取向的VS系列接口。所有结构化系统都必须具有面向集合的接口,并且几乎所有非结构化系统都具有面向值的界面。唯一想到的例外是萨尔萨,萨尔萨是一个集合的萨尔萨 - 客户端的界面,但仍允许图形中的任意边缘并单独跟踪这些边缘。)

在高时的临时工作负载中,输入通常通常通过窗口或会话进行分组(例如分析,监控或传感器融合)。这使得一种健忘 - 一旦我们'重新确保没有新的输入将在给定的窗口或会议中到达我们可以将结果导出到一些外部系统并丢弃工作状态,以安全的知识安全地安全投入永远不会影响任何未来的工作。该地图的这部分系统通常被称为'流'系统。

在低时间位置工作负载中,给定输入事件的处理通常可以受到过去的一些其他输入事件的影响(例如,银行可以' t停止跟踪客户' sally只是因为他们避风港&#39最近花了什么)。这些工作负载通常涉及不展开的聚合并通过时变的集合加入,因此关键特征能够传播到输入的更改,而不是仅附加新输入。在地图的这一部分的系统Don' t有一个常见的术语,但是'增量查看维护'通常由数据库人使用。

这个部门非常柔软。大多数严重的工作负载具有高时间局部位置和低时间位置计算的混合,并且该划分的两侧的系统正在趋向于处理两种工作负载,因此该划分的能力较少,更重要地了解工作负载在设计师的思想中,是最重要的,这在文档中看起来大部分。

值得注意的是,该地图的低时间局部侧的系统通常更年轻。到目前为止,高时的局部侧已经收到了大部分注意力,可能是因为广告业的需求。

(此部门在这里有更多详细的详细信息,包括在Flink和KSQLDB中的不一致的示范

内部一致性意味着始终返回输出,这是某些当前或过去输入的正确结果。内部不一致的系统可能会返回输出,这些输出不是任何过去输入的正确结果。也许他们多次处理了一些更新,或者在楼层上丢弃了更新,或者将一个输入的一部分组合在另一个中,或者在图中的一个路径中完成了一些更新,但尚未掉落。内部不一致的系统可以生成无限性的错误和不可能的输出,只要新的输入继续到达可能永远不会收敛到正确的答案。

(最终一致性和内部一致性重叠,但既不意味着其他 - 允许最终一致的系统在收敛之前在内部不一致答案,内部一致的系统不必收敛到最新结果。我们通常想要两者。)

最简单的方法是一次通过整个系统处理输入。这很容易处于小规模,这就是为什么不得and and#39; t任何不一致的非结构化系统。但是,当试图扩展到更大的细粒度变化时,一次处理一个变化需要太多等待。相反,我们希望尝试并行工作。正确地进行这一点通常需要具有明确的时间模型,其与传入数据一起跟踪,以允许系统推理各种中间结果的哪个版本在一起,并且当它安全地产生输出时。

许多流行的系统允许在各种场景下内部不一致。此信息通常埋在文档中,而不是明确宣传。由于使用这些系统的人们通常认为它们会产生一致的结果。为了复制这种混乱,'如果这样的系统在开发过程中表现出色,而且在生产开始时才能在压力下悄然产生不正确的结果。

它非常值得注意的是,所有高时的局部地区系统也在内部不一致。当您的所有输入都窗口窗口时,内部不一致的效果不像有害 - 您只需等到窗口在查看结果之前关闭。在低时间位置工作负载中,没有方便的停止点,因此我们必须更加谨慎。

内部不一致的系统要求用户推理流事件的所有可能的交错。内部一致的系统允许用户假装他们只是操作非常快速的批处理系统。我想忽略内部不一致的系统,因为认知复杂性是如此之高,但遗憾的是几乎所有选项都会排除。

每当输入更改时,急切系统会主动计算新的输出。延迟系统等待直到需要输出。

懒惰是有道理的,当大部分时间都没有读取。许多网站后备归入此类别 - 可能的页面列表甚至可能是无限的,因此在飞行时计算结果而不是前面的结果是有意义的。

另一方面,懒惰的系统可以' t在出现某个输出时提供通知,因为它们赢得了'甚至知道输出直到要求计算它。这使得它们适合识别,例如监测。

在实践中,似乎人们倾向于使用渴望的系统和近似懒惰,在不需要对输出中运行ad-hoc查询,或者通过将输出列表添加到输入中。唯一实际懒惰的结构系统I' m意识到是菊菊,这就是为什么这个师在地图上出现。

我想专注于结构化的系统,它可以处理低时间位置和高时间局部工作负载。 这为我们提供了差分数据流,Flink和Kafka Streams。 我' LL还包括诺里亚,因为我可以追求懒惰,但据我所知,它可以支持窗户,所以它只能处理低时间局部工作负载。 然后稍后我们也可以看看实现的物质化,Flink SQL和KSQLDB,以了解查询规划如何复杂化问题。 我的工作目前是通过分享思想和工作的共享和工作,与我在GitHub上赞助我的人。