查看完整直播回放:https://cloud.tencent.com/edu/learning/live-2952 云函数 SCF 存储的局限
前 Serverless 架构已经在很多场景中落地,无论是使用 API 网关 SCF 云函数实现 API 服务和Web 服务,还是通过对象存储 COS 触发函数运行,进行文件上传事件的传递和文件的处理,或者通过消息队列中的消息触发函数,进行消息的过滤转储;Serverless 依靠其快速开发上线,无需复杂运维的特性,正逐步进入到更多的业务场景中。 但是在实际的使用过程中,云函数作为计算形态的产品,提供了计算高度的弹性扩缩容,但是在存储方面仍然有很多的限制或不便之处。目前在云函数运行时,运行环境中的文件系统均为只读,仅在`/tmp`目录下提供了 512MB 的临时存储空间;临时存储空间为单并发实例使用,各并发实例之间不共享;临时空间在并发实例复用时会保留文件,业务代码如果有写文件,需要自行注意清理避免空间写满;同时在并发实例长时间未使用销毁时,临时空间也会清理。 长期以来,云函数中的文件相关操作,由于受到如上的一些限制,通常仅能通过使用对象存储来解决。需要使用的文件,通常从对象存储中下载到本地;在本地完成处理或生成的文件,在函数执行结束前也需要上传到对象存储中持久保存。很多场景通过使用对象存储 COS 产品可以解决,但是由于均需要使用 sdk 来完成对象存储的文件操作,从文件操作的便利性上来说,始终没有直接的本地文件操作来的简单方便。
文件存储 CFS 给云函数提供按需扩展的存储空间
文件存储(Cloud File Storage,CFS)产品提供了安全可靠、可扩展的共享文件存储服务,可以为各种计算类产品提供容量和性能可弹性扩展的高性能共享存储。通过与云函数产品的对接,CFS 可以提供按需扩展的存储空间,并按实际的使用容量来付费,符合 Serverless架构的特性。
从 COS 对象存储,和 CFS 文件存储的特性对比上,可以看到两者均提供了充足可扩展的存储空间,均使用按实际使用量的方式进行付费;CFS 由于通常是通过文件系统挂载的方式使用,因此通常在 VPC 内网中提供服务,而 COS 由于通过 HTTP API 提供服务,因此在内外网中均可以提供服务;使用方式的差异,造成了我们通过代码在实际操作文件时,COS 要依赖 API 或 SDK 来进行文件相关操作,而 CFS 可以和使用本地文件系统一样的方式,通过各种开发语言自带的标准文件系统库来进行操作。
文件存储 CFS 云函数 SCF 的优势
通过 CFS 提供的共享文件存储服务,可以为云函数解决在实际使用过程中碰到的存储方面的问题,并进一步扩展云函数可以支持的使用场景。从功能点上来说,对接 CFS 可以获得的优势包括了: - 扩展存储空间,函数运行环境内的存储空间不再受限与 512 MB 的临时存储空间。 - 存储空间的持久保存,CFS 提供的存储空间,不会随着函数并发实例的销毁而清理,而是可以持久保存。 - 跨并发和跨函数访问,CFS 的存储空间,是在函数的并发实例间共享的,而如果将同一个 CFS 存储空间挂载到多个函数上,存储空间也可以在多个函数间共享;共享特性可以带来很多文件操作的便利性,但是同时也需要注意文件读写的并发特性,在多并发写同一文件时注意写顺序或使用写锁来互斥。 - 标准 posix io 接口,使用各个语言自带的 filesystem 文件系统库即可操作,无需额外的 SDK;而如果需要额外使用一些 SDK、Agent 等,也可以直接进行文件读写。
文件存储 CFS 给云函数带来的业务新场景
通过 CFS 文件存储产品获得的优势,可以改善和扩展现有云函数所实现的一些场景,也可以带来很多新的场景。
如上图所示,在使用云函数进行对象存储文件解压的场景中,由 COS 对象存储中的 ZIP 文件上传事件触发函数,函数在获取到事件后,通过下载 ZIP 文件,在本地完成解压并再次上传到对象存储中,实现 ZIP 文件的上传自动解压能力。受限于函数的临时空间 512 MB 的限制,以及原始文件和解压后文件均需要放置在临时空间中,这种时候,函数可以解压的文件大小受限,过大的 ZIP 文件,要么下载压缩文件后没有空间存放临时的解压文件,要么无法下载超过限制的压缩文件。而通过 CFS 扩展存储空间,可读写的空间不再受到临时空间的大小限制,在文件解压缩场景下,也可以实现大压缩文件的解压了。
而在有些科学计算或 AI 推理的场景中,由于函数的代码包目前仅支持解压后 500 MB 的大小,因此一些很大的依赖库,无法随着代码包上传,或上传为层;在这种情况下,一些依赖库或依赖文件例如 AI 推理所需要的模型,需要在函数启动运行时从外部例如对象存储中下载到函数的临时空间中,下载和解压过程会大大拉长函数的启动时间,造成初始化耗时变长,影响函数的实际执行。这个问题同时也在一些 Nodejs 的运行环境中容易出现,node 的 modules 依赖较多的情况下,很容易超过代码包的体积大小限制。通过挂载使用 CFS提供的共享可扩展空间,可以将依赖包放置到外部空间中,来避免受限。这种情况下,依赖包可以通过另一个挂载了同样CFS 空间的函数甚至是 CVM 虚拟机来进行方便的管理,在AI 推理场景中,模型都可以通过共享的 CFS 来很容易的从训练的环境或虚拟机中完成更新。
在使用云函数进行对象存储文件上传触发的音视频转码场景中,CFS 的引入一样可以扩展音视频转码可以处理的文件大小。在受限临时文件存储空间大小的情况下,音视频转码之前仅能进行小体积视频文件或音频文件的下载、转码和上传,而大体积视频的处理,需要利用对象存储来进行分段的下载、转码、上传和拼接。通过 CFS 的扩展空间,可以支持进行大体积视频文件的转码处理过程。同时,在大体积的视频文件处理上,通常利用云函数的多并发能力,会通过将视频文件分片、分别转码处理、再次合并转码后文件的处理流程,通过这种流程,可以大大加速大文件的处理速度,充分利用函数的多并发处理能力。在这种处理流程上,可以通过 CFS 的扩展,以及跨多并发实例多函数的能力,在同一个 CFS 的空间中,由不同函数分别来完成分片、转码、合并的工作。通过这种方式,大大简化了开发方法,降低了文件操作的复杂性。 通过对接 CFS 文件存储与 SCF 云函数,为云函数带来了很多的扩展使用场景,除了上面提到的 3 种之外,还有很多方面可以去尝试,使用 CFS 来解决 Serverless 应用开发过程中碰到的存储问题。例如可以通过 CFS 来存储全局的业务配置信息,并在多个函数间共享实现配置共享;可以通过 CFS 存储 Web 服务中用户的session 记录这类状态数据等场景。 我们也期待更多的 Serverless 应用开发者,从 CFS SCF 的使用过程中,持续发现和探索更多的应用场景。