函数服务提供代码部署和容器镜像部署两种部署方式,使用容器镜像请参考 Native 运行时。本文为您介绍使用代码部署方式进行代码编写时的相关基本概念。
handler 是函数请求处理逻辑的入口。当您的函数接收到调用请求时,函数服务会从 handler 函数开始执行,启动函数服务进程,对请求事件进行处理。
handler 函数中一般包含 event 入参和 context 入参。
initializer 是函数的初始化逻辑入口。如果设置了 initializer 函数,函数服务会首先调用 initializer 完成函数的初始化,之后再调用 handler 处理请求。单个函数内的实例级别全局初始化,推荐使用 initializer 函数进行。
工作原理
如果您传入了一个非空的 initializer 函数,函数服务将托管函数的初始化进程。在函数的服务端进程启动后(通过 Liveness 探针获知),函数服务会下发控制信令,调用 initializer 以执行函数的初始化逻辑,确保函数初始化成功。您可以通过返回 error(或初始化过程中发生 panic)来标识初始化失败。如果函数初始化失败,请求结果会返回 initializer 失败,请求不会被执行。
优势
使函数的初始化和函数服务端启动解耦
如果 initializer 失败,不会导致函数的进程被反复重启。而如果在 main 函数或者 init 函数中初始化,初始化不成功会导致您函数服务端无法正常启动,引起函数频繁被拉起或者发布失败等情况。
平滑扩容
在扩容的场景下,函数服务的数据流量调度逻辑,会尽量在函数的 initializer 被执行成功后,才为当前实例注入新的流量,尽可能保证扩容的平滑性。