开源串流处理框架Apache Flink开发商Ververica推出了一个新的有状态分布式应用程序框架Stateful Functions,降低构建以及调度分布式有状态应用程序的复杂度,Stateful Functions能结合Apache Flink以及函数即服务(Function-as-a -Service,FaaS)的优点,提供事件驱动基础架构的抽象。

Ververica提到,由于Kubernetes和FaaS的发展,无状态运算应用程序的调度已经发展至一定的程度,但仍无法满足有状态的分布式应用程序需求,市面上主要的解决方案多数关注计算而非状态,函数之间的交互障碍,影响了开发工作的简便性,也阻碍分布式数据的一致性。
而Stateful Functions就是为了解决这些限制出现,用户可以定义松耦合且独立的函数,这些函数可以通过共享小型资源池,来维持一致性地交互。

Stateful Functions由两部分组成,分别是Runtime以及API,其使用Apache Flink内置的Runtime,进行分布式协调、沟通和状态管理,应用程序的状态会存储在串流处理引擎中,与计算资源位在同一处,可以提供快速且一致的状态访问,并且获得Apache Flink分布式快照模型的支持,提供强健的状态永久性和容错性。
Stateful Functions API则封装了商业逻辑小片段功能,这些函数以虚拟实例的形式存在,在应用程序中通常是指每个用户或是存货对象等实体,其分散在每个存储分片中,因此应用程序可以简单地横向扩展。每个函数在本地端都具有永久用户定义的状态,并且能够任意的向其他函示发送消息。
Ververica特别解释,Stateful Functions框架并不是用来取代FaaS或是其他无服务器服务的,而是要提供一种同时具有无服务器服务的特性,但又适用于解决状态中心问题的解决方案。像是由事件驱动的应用程序,因为需要操作状态机(State Machine)并且纪录背景信息,因此很适合使用状态中心范式开发。
Stateful Functions通过使用Apache Flink的串流处理,扩展其状态管理以及容错模型,来达到简化状态逻辑,并扩展不同状态和事件之间交互的规模,而由于这个模型的状态与运算位在同一处,因此应用程序要取得状态的时候,不需要访问外部存储系统,或是使用专用状态管理模式来维持状态一致性。Stateful Functions的存储分为两层,一个是短暂状态/计算层Apache Flink,另一个则为简单地永久性Blob存储层,而永久存储可让每个函数实例,独立地维护并关注容错状态。
虽然Stateful Functions API独立于Apache Flink,但是其Runtime是基于Apache Flink的DataStream API构建。Ververica表示,Stateful Functions应用程序通常是模块化,其中包含了多个函数集,只要使用单一Apache Flink应用程序就能进行多任务处理,让各函数维持一致状态且可靠地交互,这样的好处是让多个小工作共享资源池,不需要事先准备应对高峰访问的资源,绝大多数的时间虚拟实例都是闲置状态,不消耗任何资源。