首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Stateful Functions开源:集成了Flink和FaaS的流处理优点

近日,有状态函数(Stateful Functions ,statefun.io)宣布开源,它可以极大降低构建和编排分布式有状态应用程序的复杂性,集成了Apache Flink和函数即服务(Function-as-a-Service,FaaS)的流处理优点,为下一代事件驱动架构提供了强大的抽象能力。这篇博客将为开发者介绍有状态函数产生的原因、概念以及如何使用。

问题:有状态应用仍然很难

在Kubernetes和 FaaS等技术的推动下,无状态计算的编排已经取得了长足进步,但是由于大多数产品主要关注的是计算,而不是状态,所以当涉及到有状态的分布式应用程序时,这些技术仍然不能很好得满足要求。此外,函数之间的交互仍然会为开发的整体易用性和分布式数据的一致性带来挑战。

Stateful Functions是专门为突破这些限制而构建的,它让开发者能够定义松耦合、独立的函数,这些函数占用空间很小,可以在共享资源池中进行一致且可靠的交互。该框架由实现“Stateful Functions”的抽象API(图1)和基于Apache Flink用于分布式协调、通信和状态管理的运行时组成。

Stateful Functions API

该API基于Stateful Functions,封装了业务逻辑的小功能片段,有点类似于actors。这些函数以虚拟实例的形态存在,虚拟实例通常是指应用程序中的每个实体(例如,每个用户都有一个虚拟实例),并且这些函数分布在碎片上,从而使应用程序具有开箱即用的水平可伸缩性。每个函数在局部变量中都有持久的用户定义状态,并且可以随意向其他函数(包括它自己)发送消息,并能保证只发送一次。

运行时(Runtime)

支持Stateful Functions的运行时是基于Apache Flink流处理的。状态保存在流处理引擎中,与计算位于同一位置,并能提供快速且一致的状态访问。状态的持久性和容错性是建立在Flink具有鲁棒性的分布快照模型上的。

图1

计算状态,而不是根据状态计算

该框架不是为了替代FaaS或者Serverless,相反,Stateful Functions的目的是提供一组类似于Serverless计算属性的功能,但这些功能是用于解决以状态为中心的问题。

以状态为中心(State-centric)

有状态函数主要用于衡量状态和不同状态与事件之间的交互,以促进这些交互的逻辑作为计算的主要焦点。事件驱动的应用程序需要处理交互状态机并且记录上下文信息,这非常适合以状态为中心的范例。

以计算为中心(Compute-centric)

另一方面,FaaS和Serverless应用程序框架主要擅长弹性扩展专用计算资源。与状态和其他函数的交互,整合的不是很好,当然这也不是它们的核心优势。拟合用例中一个很好的例子是经典的“使AWS Lambda实现镜像的伸缩”。

图2

为了实现这一点,Stateful Functions API 下的运行时依赖于Apache Flink的流处理,并且扩展了其强大的状态管理容错模型。容错模型的主要优点是状态和计算共存于同一网络,这意味着不需要记录每次往返,就可从外部存储系统(如Cassandra、DynamoDB)中获取状态,也不需要使用特定的状态管理模式来实现一致性(如事件源、CQRS)。其他优点还包括:

  • 不需要管理动态消息,也不需要维护复杂的复制或重新分区策略,因为持久性和为状态快照提供对象存储一样简单;
  • 流(快速实时)处理和批(离线)处理的高吞吐量允许开发者模糊事件驱动应用程序和通用数据处理之间的界限。

Stateful Functions对计算和存储的划分与经典的两层架构不同,它维护了一个短暂的状态/计算层(Apache Flink)和一个简单的持久化blob存储层(图2)。在编程上,持久性是基于持久化值的概念,这使得每个函数实例都能够独立维护和跟踪容错状态。

扩展流处理范围

尽管Stateful Functions API 独立于Flink,但运行时是在Flink的DataStream API之上构建的,并且使用了轻量版的过程函数(即访问状态的低级函数)来实现底层抽象。与vanilla Flink相比,核心优势在于函数可以任意将事件发送给其他函数,而不仅仅是DAG的下游。

图3

Stateful Functions应用程序通常是模块化的,包含了多个函数包,这些函数包可以一致且可靠地交互,并复用到一个Flink应用程序上(图3)。这使得许多小工作可以共享相同的资源池,并根据需要加以利用,而无需预订高峰时可能需要的资源。在任何时候,绝大多数虚拟实例都是空闲的,不会消耗任何计算资源。

结束语

如果开发者对这个项目感兴趣,可以进行尝试,建议开始前先查阅文档并遵从介绍演练,从简单的有状态的“Hello World!”(图4)到更复杂的拼车应用程序。如果发现了bug或有其他改进想法,建议通过GitHub提交问题或打开pull请求。任何时候,开发者都可以用#statefun标签向项目创建者询问堆栈溢出问题。

图4

Stateful Functions是一项正在进行中的工作,未来将持续改进来建立和扩大价值,例如支持非JVM语言、细粒度的可观察性和更严格的恢复时间。对运行时和操作进行增强的可能性也会随着Apache Flink的发展而完善。该项目创建者的目标是为Apache软件基金会(Apache Software Foundation)贡献Stateful Functions,并使其成为Apache Flink的一部分,在一个开放的社区中发展,与开发者密切合作,解决真实的问题,这是学习和成长的最佳方式,然而是否接受这个项目最终取决于Flink社区。

原文链接:

https://www.ververica.com/blog/announcing-stateful-functions-distributed-state-uncomplicated

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/0xbsDHIDUlNLlPPh8vo0
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券