目前 Serverless 架构已经在很多场景中落地,无论是使用 API 网关 + 云函数 SCF 实现 API 服务和 Web 服务,还是通过对象存储 COS 触发函数运行,进行文件上传事件的传递和文件的处理,或者通过消息队列中的消息触发函数,进行消息的过滤转储;Serverless 依靠其快速开发上线,无需复杂运维的特性,正逐步进入到更多的业务场景中。
目前,使用对象存储 COS 进行云函数中的文件相关操作,当用户需要使用文件,从对象存储中下载到本地;在本地完成处理或生成的文件,在函数执行结束前上传到对象存储中持久保存。很多场景通过使用对象存储 COS 产品可以解决。由于这种解决方法均需要使用 SDK 来完成对象存储的文件操作,从文件操作的便利性上来说,不如直接的本地文件操作来的简单方便。
从 COS 对象存储和 CFS 文件存储的特性对比上,可以看到两者均提供了充足可扩展的存储空间,均使用按实际使用量的方式进行付费;CFS 由于通常是通过文件系统挂载的方式使用,因此通常在 VPC 内网中提供服务,而 COS 由于通过 HTTP API 提供服务,因此在内外网中均可以提供服务;使用方式的差异,造成了我们通过代码在实际操作文件时,COS 要依赖 API 或 SDK 来进行文件相关操作,而 CFS 可以和使用本地文件系统一样的方式,通过各种开发语言自带的标准文件系统库来进行操作。
如上图所示,在使用云函数进行对象存储文件解压的场景中,由 COS 对象存储中的 ZIP 文件上传事件触发函数,函数在获取到事件后,通过下载 ZIP 文件,在本地完成解压并再次上传到对象存储中,实现 ZIP 文件的上传自动解压能力。受限于函数的临时空间 512 MB 的限制,以及原始文件和解压后文件均需要放置在临时空间中,这种时候,函数可以解压的文件大小受限,过大的 ZIP 文件,要么下载压缩文件后没有空间存放临时的解压文件,要么无法下载超过限制的压缩文件。而通过 CFS 扩展存储空间,可读写的空间不再受到临时空间的大小限制,在文件解压缩场景下,也可以实现大压缩文件的解压了。
而在有些科学计算或 AI 推理的场景中,由于函数的代码包目前仅支持解压后 500 MB 的大小,因此一些很大的依赖库,无法随着代码包上传,或上传为层;在这种情况下,一些依赖库或依赖文件例如 AI 推理所需要的模型,需要在函数启动运行时从外部例如对象存储中下载到函数的临时空间中,下载和解压过程会大大拉长函数的启动时间,造成初始化耗时变长,影响函数的实际执行。这个问题同时也在一些 Nodejs 的运行环境中容易出现,node 的 modules 依赖较多的情况下,很容易超过代码包的体积大小限制。通过挂载使用 CFS 提供的共享可扩展空间,可以将依赖包放置到外部空间中,来避免受限。这种情况下,依赖包可以通过另一个挂载了同样 CFS 空间的函数甚至是 CVM 虚拟机来进行方便的管理,在 AI 推理场景中,模型都可以通过共享的 CFS 来很容易的从训练的环境或虚拟机中完成更新。