云函数 SCF 提供的是弹性按量计算的 FaaS 服务,可作为 Workload 承载众多 Serverless 应用。SCF 在运行时,开发者会由于业务需求访问各类外部数据,如导入第三方库、非结构化数据以及函数计算输出,这就需要云函数 SCF 提供丰富的存储支持类型,以支持开发者的业务需要。
云函数 SCF 目前已支持的存储类型,其中包括对接云上的其他云产品对象存储 COS、文件存储 CFS,同时还要本地临时存储,以及层。本篇文档介绍这些存储类型之间的区别,供开发者选型时参考。
选型分析
下表从不同维度比对了云函数 SCF 的这四种不同数据存储选项的特性:
条目  | 对象存储 COS  | 文件存储 CFS  | 临时存储 /tmp  | 层  | 
最大空间  | 弹性  | 弹性  | 默认免费空间:512MB   | 层版本代码 + 层所关联的函数版本代码大小总和为 500 MB(压缩前)  | 
持久性  | 持久化  | 持久化  | 临时存储  | 持久化  | 
存储内容  | 可写  | 可写  | 可写  | 不可写  | 
存储类型  | 对象  | 文件系统  | 文件系统  | 代码依赖归档  | 
事件源集成  | 是  | 否  | 否  | 否  | 
操作  | 对象存储  | 文件读写  | 文件读写  | 运行时不可写  | 
计费  | 无额外计费  | |||
调用间共享  | 是  | 是  | 否  | 是  | 
函数的访问速度  | 快速的  | 非常快  | 最快的  | 快速的  | 
业务场景  | 日志、业务文件存储  | 日志、业务文件存储  | 业务产生的临时文件  | 减少代码包体积或函数之间复用代码库、工具等  | 
存储类型
对象存储 COS
腾讯云 对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、可靠安全等优点。对象存储非常适合存储非结构化数据。这包括二进制数据,例如图像或媒体、日志文件和传感器数据。
开发者可以利用 SCF 提供的 SDK,使用通用的 HTTP 协议以免挂载的方式,快速实现对 COS Bucket 中的对象创建删除等,来完成业务逻辑的闭环。同时 COS 可作为事件源将事件发布给 SCF,并携带事件数据调用函数,以此实现函数事件源集成。 
基于 SCF + COS 实现实时音视频转码,满足当上传图片、音视频的总量大、频率高时,对应不同的清晰度使用多个云函数对其分别处理,以满足不同场景下用户的需求,同时适应移动网络带宽较小且不稳定的特性。对象存储是数据湖的重要存储库,Serverless 架构的入湖方案是通过云函数触发器拉起数据调用后,通过云函数捕获并记录批次数据信息,在函数内闭环相关的结构转换、数据格式转换和数据压缩等能力。
另外,对象存储 COS 的智能分层存储类型为数据提供了冷热分层机制,能够根据用户数据的访问模式,自动地转换数据的冷热层级,从而降低用户数据的存储成本。用于访问模式不固定或者无法预估访问模式的数据,为用户提供了与标准存储一致的低延迟和高吞吐的产品体验,但成本上则低于标准存储。
文件存储 CFS

CFS 符合标准的 NFS 文件系统访问协议,为多个计算节点提供共享的数据源,支持弹性容量和性能的扩展,现有应用无需修改即可挂载使用,是一种高可用、高可靠的分布式文件系统,适合于大数据分析、媒体处理和内容管理等场景。CFS 成本低廉,采用按量计费模式,以小时为计费周期,您只需为实际使用的存储空间付费。
云函数 SCF 支持与 CFS 无缝集成,只需进行相关配置,您的函数即可轻松访问存储在 CFS 文件系统中的文件。使用 CFS 的优势如下:
函数执行空间不受限。
多个函数可共用一个文件系统,实现文件共享。
临时存储 /tmp
云函数 SCF 执行环境在
/tmp目录提供了一个文件系统供开发者使用,该空间的大小免费额度为512MB。同时会根据函数内存大小相应调整每个函数最大支持的临时存储空间,函数内存越大,相应的临时存储空间额度也越高,最高可达10GB。对于更高的存储需求,可以 提交工单 申请白名单支持。超出免费临时存储空间部分将按照临时存储配额使用量进行计费。vCPU(核)  | 内存大小(MB)  | 磁盘大小范围(GB) 仅支持 0.5GB 步长输入  | 
0.1  | 64  | 0.5  | 
0.1  | 128  | 0.5  | 
0.2  | 256  | [0.5-1]  | 
0.3  | 384  | [0.5-1.5]  | 
0.4  | 512  | [0.5-2]  | 
0.5  | 640  | [0.5-2.5]  | 
0.6  | 768  | [0.5-3]  | 
0.7  | 896  | [0.5-3.5]  | 
0.8  | 1024  | [0.5-4]  | 
0.9  | 1152  | [0.5-4.5]  | 
1  | 1280  | [0.5-5]  | 
1.1  | 1408  | [0.5-5.5]  | 
1.2  | 1536  | [0.5-6]  | 
1.3  | 1664  | [0.5-6.5]  | 
1.4  | 1792  | [0.5-7]  | 
1.5  | 1920  | [0.5-7.5]  | 
1.6  | 2048  | [0.5-8]  | 
1.7  | 2176  | [0.5-8.5]  | 
1.8  | 2304  | [0.5-9]  | 
1.9  | 2432  | [0.5-9.5]  | 
2  | 2560  | [0.5-10]  | 
2  | 2688  | [0.5-10]  | 
2  | 2816  | [0.5-10]  | 
2  | 2944  | [0.5-10]  | 
2  | 3072  | [0.5-10]  | 
4  | 6144  | [0.5-10]  | 
8  | 14336  | [0.5-10]  | 
16  | 30720  | [0.5-10]  | 
32  | 61440  | [0.5-10]  | 
64  | 122880  | [0.5-10]  | 
该存储空间的数据是单个函数实例所独占的,一个函数的多次调用可以重用相同的执行环境以优化性能,并将会在函数实例执行的生命周期内保留。
因此,这旨在作为临时存储空间。虽然函数可以在调用之间存储数据,但它应该仅用于单个调用中代码所需的数据。它不是永久存储数据的地方,而是更好地用于支持代码所需的操作。
操作使用方面,使用 /tmp 中的文件与云硬盘相同,直接用代码读写即可,并提供快速的 I/O 吞吐量。下面是使用 Python 进行文件压缩的示例。
import os, zipfileos.chdir('/tmp')with zipfile.ZipFile(yourzipfile, 'r') as zip:zip.extractall()
层
层,是云函数 SCF 来解决公共依赖库存储的方案。如果云函数 SCF 拥有较多的依赖库或公共代码文件,可以使用 SCF 中的层进行管理。层管理,可以将依赖放在层中而不是部署包中,可确保部署包保持较小的体积。
层管理是静态的。创建层的压缩文件将按照层的版本进行存储。层在与函数进行绑定时,将按照具体的层版本与函数版本进行绑定。一个函数目前最多支持绑定 5 个层的具体版本,并在绑定时有一定顺序。