rakulang, dartlang, nimlang, golang, rustlang, lang lang no see

Application Building Blocks

焉知非鱼

Application Building Block

应用构件 #

Stateful Functions 为构建事件驱动应用程序提供了一个框架。在这里,我们将解释 Stateful Function 架构的重要方面。

事件输入 #

有状态函数应用正好坐在事件驱动的领域,所以自然要从把事件摄入系统开始。

img

在有状态函数中,将记录摄入系统的组件称为事件入口。这可以是任何东西,从 Kafka 主题,到 messsage 队列,再到 http 请求 - 任何能够将数据引入系统并触发初始函数开始计算的东西。

有状态函数 #

该图的核心是命名的有状态函数。

img

把这些函数看作是你的服务的构件。它们可以任意地相互发送消息,这也是这个框架摆脱传统的流处理观点的一种方式。这些函数可以以任意的、可能是循环的、甚至是往返的方式相互通信,而不是建立一个静态的数据流 DAG。

如果你熟悉 actor 编程,这在组件之间动态消息的能力上确实有某些相似之处。然而,也有一些显著的区别。

持续状态 #

首先是所有函数都有本地嵌入的状态,即所谓的持久化状态。

img

Apache Flink 的核心优势之一就是它能够提供容错的本地状态。当在一个函数内部,当它在执行一些计算时,你总是在本地变量中处理本地状态。

容错 #

对于状态和消息传递,Stateful Functions 能够提供用户从现代数据处理框架中期望的精确的一次保证。

img

在失败的情况下,整个世界的状态(包括持久化的状态和消息)都会被回滚,以模拟完全无故障的执行。

这些保证是在不需要数据库的情况下提供的,相反,Stateful Function 利用了 Apache Flink 的成熟快照机制。

事件出口 #

最后,应用程序可以通过事件出口向外部系统输出数据。

img

当然,函数执行任意计算,可以随心所欲,这包括进行 RPC 调用和连接到其他系统。通过使用事件出口,应用程序可以利用建立在 Apache Flink 连接器生态系统之上的预建集成。