因为在这个场景中,数据的隔离性是强诉求,挂载 NAS 并做不到绝对强隔离,除非一个实例挂载一个文件系统,这也不实现,因为在这个场景下计算资源实例会非常多。
上述第4类数据无论如何只能是在实例级别,因为和 OS,和容器文件系统相关。
综上,在这种场景下,需要会话和计算资源实例通过某种方式绑定,每次打开这个会话,请求要路由到相同的实例,从而保证该会话生命周期里所有数据、状态的一致性。
阿里云函数计算 FC 支持多种亲和性方式
这个问题源自 AI Agent Code Interptreter Sandbox 场景的另一个不确定性的特性。那就是挂载存储的路径是动态的,是不确定的。只有请求到了实例里后,才知道要挂载的路径是什么。
因为通常路径都是用户ID/会话ID/[任务ID],如果是新创建的会话,只有该会话的第一个请求进了实例,才知道完整的路径是什么。所以这就需要计算资源实例可以动态挂载存储介质,而不是先挂载路径后启动实例。并且每个实例挂载的路径都是不同的。
函数计算 FC 的在持久化方面,原本就支持在函数维度设置 NAS 或 OSS 的挂载路径,在这种情况下,该函数的所有实例都会共享该挂载路径。而现在,我们又支持了可以在实例维度动态的挂载 NAS 和 OSS 路径的能力,实现了同一个函数的不同实例,可以挂载同一个文件系统/ OSS Bucket 的不同路径。
限制路径级别的文件总量 Quota 文件
在 AI Agent Coding 或者 Vibe Coding 场景下 ,用户可以随便写个类似云盘的项目,或者论坛的项目。所以可以随意上传文件,如果被非法利用,可能会引起被白嫖存储的问题。所以需要对每个项目可上传文件总量大小做限制。
目前文件系统虽然支持路径级别设置 Quota,但是 AI Agent Coding 这个场景下路径数量会非常多,可预见性的会有几万,十几万个甚至更多,所以需要另寻解决方案。
目前的方案有 2 个:
基于函数计算 FC 特性实现的。(短期临时方案)
PolarFS 支持给几乎没有上限的路径设置 Quota。(长期成熟方案)
目前函数计算 FC 正在和 PolarFS 做产品间集成,集成后这块会直接换成 PolarFS 方案。我在这里和大家分享一下当前是如何基于函数计算 FC 的特性做的临时实现。
上文中我有提到,函数计算 FC 函数的每个实例都有自己的磁盘,最小是 512MB,也有更大的额度。当超过磁盘大小后会报错。所以目前写好的项目运行在函数计算 FC 实例中,写文件的操作是先写进函数实例的磁盘中,写入成功后,再 CP 到文件系统里。当函数实例磁盘写满报错后,就不会再对文件系统做交互。相当于用函数实例的磁盘做了一层中转,但是依赖函数磁盘 Quota 的强限制,变相解决了路径配额的问题。
会话恢复机制
会话恢复的逻辑本质上是比较简单的,但是这部分涉及到效率问题也涉及到记忆问题,所以结合函数计算 FC 的特性和大家作以分享和探讨。
上文中提到了,会话底下的 Code Interpreter Sandbox 这部分使用的是函数实例磁盘+OSS 的存储方式,所以当会话需要恢复时,需要有2部分的数据需要恢复:
函数计算 FC 函数实例的存活时长(Idle Time)可由用户自行设置。目前实例存活时长为1小时,所以在这1小时内,依赖文件都在函数的临时磁盘里,从而达到高效恢复会话的效果。当在1小时内没有任何请求进来,那么实例才会被释放,所以当用户超过1个小时后再打开会话,就会重新拉起实例,从 OSS 下载代码文件,重新安装依赖,整体会话恢复时间就会较长。
默认情况下,当函数实例在5分钟内没有请求,实例就会被销毁。
因为客户可以自行控制函数实例的 Idle Time,所以可以对客户做付费分类,比如 SVIP 用户对应的函数实例 Idle Time 为24小时,VIP 用户对应的函数实例 Idle Time 为10小时,普通用户对应的函数实例 Idle Time 为1小时。
会话网络管理
会话网络管理本质上就是会话底层计算资源实例的网络管理,最核心的其实就是 IP 分配的问题。
有限的 IP 与 PodCIDR 模型:K8s 在 IP 管理分配方面有集群 CIDR,节点 PodCIDR 分配,Pod IP 分配三个维度,这种设计确保了不同节点上的 Pod IP 地址不会冲突,并且简化了路由。然而,它也引入了一个关键的制约因素:Pod 密度,即每个节点上运行的 Pod 数量。当一个节点上的 Pod 密度很高时,即便整个集群的 CIDR 地址空间还很充裕,该节点自身的 PodCIDR 也可能被迅速耗尽 。
企业安全组最大支持关联的 IP 地址数量是65535,在这个场景中实例数是很有可能超过65535的。
函数计算 FC 作为 Serverless 计算产品,自己有足够大的资源池,函数实例不会使用用户的 IP,并且底层容器的调度和 K8s 也是完全不一样的,而且在安全组方面,相同的 uid+role+vsw+vpc+sg 是复用一个 IP 的,和函数数量没关系,和实例数量也没关系,所以无需客户做任何事情,可以完美解决上述的问题。
项目分享/会话分享机制(Sandbox转传统Server)
在 Vibe Coding 环境中,当一个完全不懂编程的人,只靠一些想法,通过一些平台就可以完完全全实现出来,我觉得除了自己很兴奋外,应该会立马想把自己实现的产物分享给自己身边的朋友,无论是以什么目的做的分享,我相信这份成就感是无与伦比的,这也正是 Vibe Coding 性感的地方之一。
现在很多 AI Agent 产品主打的就是生成完整的项目,可以直接运行的项目,分享出去后可直接使用的项目,所以都会有类似发布分享的功能。大家可以想象一下,当一个由 LLM 写出来的项目,被发布了以后,其实它和什么 AI Agent,Sandbox 就没有任何关系了,运行这个项目的底层计算资源其实就是一个传统的 Server。
但这个传统 Server 面临着不普通的挑战点:
这个需求本质是因为 AI Agent 场景下的 Sandbox 执行什么样的任务是不可控的,比如有的任务就是简单的推理、查询等,对 CPU 和内存的消耗不高。但有些任务是处理文件、处理音视频,这一类的任务就是 CPU 密集型的场景,要求更高的 CPU 和内存规格。
如果是在同一个函数下的话,就需要函数的实例可以纵向扩容,函数计算 FC 的基础架构底层是支持的,但是没有对应的计费逻辑,或者说这样对客户来说计费逻辑会很复杂,所以目前函数计算 FC 从对外透出的产品能力上并不支持 VPA。
目前给推荐客户的方案如下: