Logical Functions
— 焉知非鱼Logical Functions
逻辑函数 #
有状态函数是以逻辑方式分配的,这意味着系统可以用有限的资源支持无限制的实例数量。逻辑实例在不被主动调用时不使用CPU、内存或线程,所以理论上没有可以创建的实例数量上限。我们鼓励用户根据对其应用最合理的情况,尽可能地对其应用进行细化建模,而不是围绕资源限制来设计应用。
函数地址 #
在本地环境中,对象的地址和对它的引用是一样的。但是在有状态函数应用程序中,函数实例是虚拟的,它们的运行位置不会暴露给用户。相反,地址是用来引用系统中特定的有状态函数的。
一个地址由两个组件组成,一个是 FunctionType,一个是 ID。函数类型类似于面向对象语言中的类,它声明了地址所引用的函数类型。ID 是一个主键,它将函数调用的范围限定在函数类型的一个特定实例上。
当一个函数被调用时,所有的操作–包括对持久化状态的读和写 - 都会被限定在当前地址上。
例如,想象有一个有状态函数应用程序来跟踪仓库的库存。一个可能的实现可以包括一个库存函数,它可以跟踪一个特定物品的库存单位数量;这将是函数类型。然后,仓库管理的每个 SKU 都会有一个该类型的逻辑实例。如果是服装,可能会有一个衬衫的实例和另一个裤子的实例;“衬衫"和 “裤子"将是两个 ID。每个实例都可以独立地进行交互和消息传递。应用程序可以根据库存中物品的类型自由创建实例。
函数生命周期 #
逻辑函数既不被创建也不被销毁,而是在应用程序的整个生命周期中始终存在。当应用程序启动时,框架的每个并行工作者将为每个函数类型创建一个物理对象。这个对象将用于执行该类型的所有逻辑实例,该类型的逻辑实例由该特定的 worker 运行。第一次向一个地址发送消息时,它将像该实例一直存在一样,其持久化状态为空。
清除一个类型的所有持久化状态与销毁它是一样的。如果一个实例没有状态,也没有主动运行,那么它就不占用 CPU,不占用线程,也不占用内存。
一个实例在其一个或多个持久化值中存储了数据,它只占用存储该数据所需的资源。状态存储由 Apache Flink 运行时管理,并存储在配置的状态后端。