# 逻辑函数

有状态函数是逻辑分配的，这意味着系统可以用有限的资源支持无限数量的实例。逻辑实例在未被激活时不使用CPU、内存或线程，因此在理论上对可以创建的实例数量没有上限。鼓励用户根据对其应用程序最有意义的内容，尽可能地对其应用程序进行粒度建模，而不是围绕资源约束设计应用程序。

## 函数地址

&#x20;在本地环境中，对象的地址与其引用相同。但是在有状态功能的应用程序中，功能实例是虚拟的，并且它们的运行时位置不会暴露给用户。相反，地址用于引用系统中特定的有状态函数。

![](https://3163404701-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8AKnb0rgBMRI9bnuei%2F-M8DsobP5_b0JJ3B54BI%2F-M8Dt_iFBkWAwEa42UgJ%2Fimage.png?alt=media\&token=16498cba-adef-447d-8806-2b94140d27fc)

地址由两个部分组成：`FunctionType`和`ID`。函数类型类似于面向对象语言中的类。它声明地址引用的是哪种功能。id是一个主键，它将函数调用的作用域限定为该函数类型的特定实例。

调用一个函数时，所有操作（包括对持久状态的读取和写入）都将作用于当前地址。

&#x20;例如，假设有一个状态函数应用程序来跟踪仓库的库存。一种可能的实现可能包括一个 `Inventory` 函数，它跟踪特定项目的库存单位数量；这就是函数类型。然后，仓库管理的每个SKU都会有一个这种类型的逻辑实例。如果是衣服，可能有衬衫和裤子的实例；“衬衫”和“裤子”是两个id。每个实例都可以独立地进行交互和消息传递。应用程序可以自由创建与库存中的项目类型一样多的实例。

## 函数生命周期

逻辑函数既不被创建也不被销毁，而是始终存在于应用程序的整个生命周期中。当应用程序启动时，框架的每个并行工作人员将为每个函数类型创建一个物理对象。此对象将用于执行由该特定工作者运行的该类型的所有逻辑实例。第一次将消息发送到某个地址时，该实例将始终存在，其持久化状态为空。

清除所有类型的持久化状态等同于销毁它。如果一个实例没有状态并且不处于活动状态，那么它就不占用CPU、线程和内存。

在一个或多个持久值中存储数据的实例只占用存储该数据所需的资源。状态存储由Apache Flink运行时管理，并存储在配置的状态后端。
