Flink前瞻欧洲2019年,斯蒂芬埃文从ververica宣布发布状态函数,一个开源框架,以减少构建和协调分布式有状态应用程序的复杂性大规模。有状态函数将流处理的好处与Apache Flink和功能即服务 (FaaS) 相结合,为下一代事件驱动的体系结构提供强大的抽象。

在本文中,我们将解释构建有状态函数背后的动机,以及为什么我们向 Apache Flink 社区建议将该项目作为开源贡献。

Staeful Functions

问题:有状态应用程序仍然困难

尽管无状态计算的编排已经取得了长足发展——由 Kubernetes 和 FaaS 等技术驱动,但对于大多数有状态分布式应用程序而言,大多数产品仍然不够,主要侧重于计算,而不是状态。此外,功能之间的交互仍然对整体易于开发和数据一致性构成挑战。

状态函数专为克服这些限制而构建,允许用户定义松散耦合的独立函数,其占用空间较小,可以在共享资源池中一致可靠地交互。该框架由实现”有状态函数”抽象的 API 和基于 Apache Flink 的运行时组成,用于分布式协调、通信和状态管理com/文章/流处理与apache-flink”rel=”nofollow”_流处理与ApacheFlink。

有状态函数 API

该 API 基于 – 顾名思义, 有状态函数: 封装业务逻辑的小功能片段,有点像参与者。这些函数以虚拟实例的形式存在,通常,应用程序中每个实体(例如每个用户或库存项目)一个实例,并且分布在分片上,从而可以横向扩展应用程序开箱即用。每个函数在局部变量中具有持久用户定义的状态,并且可以任意向其他函数(包括自身)发送消息,并保证一次。

运行

为有状态函数供电的运行时基于使用 Apache Flink 的流处理。使用有状态函数,状态和计算在流处理引擎中位于一起,使您能够快速一致地访问状态。状态持久性和容错能力基于 Flink 强大的分布式快照模型

Image title

图1

计算通过状态,而不是从状态计算

该框架并非要取代 FaaS 或(甚至)无服务器;相反,它旨在提供一组类似于应用于以状态为中心的问题的无服务器计算的特征的属性。

以国家为中心

有状态函数主要扩展状态以及不同状态和事件之间的交互,逻辑有助于将这些交互作为计算的主要焦点。事件驱动的应用程序,在交互状态机和需要记住上下文信息之间摇摆不定,非常适合以状态为中心的范例。

以计算为中心

另一方面,FaaS 和无服务器应用程序框架擅长弹性扩展用于计算的专用资源。与国家和其他功能交互不是整合的,而不是其核心力量。拟合用例的一个好示例是经典的”使用AWS Lambda 调整映像大小“。

Image title

apache.org/projects/flink/flink-docs-stable/dev/stream/state/state.html”rel=”nofollow”目标=”_blank”=状态管理和容错。此模型的主要优点是状态和计算位于网络的同一侧,这意味着您不需要从外部存储系统(例如 Cassandra、DynamoDB)或特定状态管理模式(例如事件源、CQRS)获取状态。其他优势包括:

  • 无需管理动态消息和维护复杂的复制或重新分区策略,因为持久性与为状态快照设置对象存储一样简单。

  • 流(快速实时)和批处理(脱机)处理的高吞吐量,使您能够模糊事件驱动应用程序和泛型数据处理之间的界限。

有状态函数对计算和存储的拆分方式不同于传统的两层体系结构,维护:一个临时状态/计算层(Apache Flink)和一个简单的持久 blob 存储层(图 2)。从程序上讲,持久性基于持久值的概念,该值使每个函数实例能够独立维护和跟踪容错状态。

流处理,扩展

尽管有状态函数API 独立于 Flink,但运行时构建在 Flink 的DataStream API之上,并使用一个轻量级版本的进程函数(即低级函数访问状态)在引擎盖下实现此抽象。与香草 Flink 相比,有状态函数的核心优势是每个函数都可以任意将事件发送到所有其他函数,而不仅仅是 DAG 中的下游函数。
Image title

图3

有状态函数应用程序通常是模块化的,包含多个函数包,可以一致可靠地交互,多路复用到单个 Flink 应用程序(图 3)。这允许许多小型作业共享相同的资源池并根据需要加以利用,而无需预先需要的资源。在任何时候,绝大多数虚拟实例处于空闲状态,不会消耗任何计算资源io/getting_started/index.html=”rel=”nofollow”目标=”_blank”,文档并遵循介绍演练之一,从一个简单的有状态的”你好世界!(图4)到更复杂的乘车共享应用程序。

Image title

图4

如果您发现一个 bug 或知道如何改进项目,我们强烈建议您在GitHub上提交问题或打开拉取请求!您可以随时使用井号标签#statefun,向我们询问有关堆栈溢出的问题。

即将进行的工作

状态函数是一个在进行中的工作,我们认为这是一个有希望的方向。我们的团队将继续引入改进,以建立和放大项目的价值,例如支持非 JVM 语言、细粒度可观察性和更严格的恢复时间。增强运行时和操作的可能性也将随着 Apache Flink 功能的发展而演变。

状态函数已被接受为 Apache 软件基金会的贡献,作为 Apache Flink 的一部分,启动发布即将发生。敬请期待!

进一步阅读

Comments are closed.