设计一个FASS架构中的云函数运行时
Faas 架构
在现代云计算的范畴里,FaaS是一个比较新潮的概念,在FaaS里面用户只需要关注自己的代码逻辑,可能是一个函数或者是一个脚本,不用关注底层的资源或者程序运行所需的运行时。也不用关注资源负载和流量并发度和100%免运维体验,因为这些FaaS都帮我们解决了,这通常意味着开发周期更短。
以RAG平台的知识入库场景为例,预处理流程(分片→Embedding→向量存储)存在以下技术挑战:
- 计算密集型操作导致同步处理吞吐量受限
- 异构Embedding模型(如未来多模态支持)带来的运行时环境差异
- 海量任务下的资源弹性需求
通过FaaS架构实现异步任务系统,我们构建了如下解决方案:
- 事件驱动架构 :RAG平台将知识录入请求投递至消息队列,解耦前后端处理流程
- 动态资源分配 :自定义函数实例配置为2C2G规格,基于队列堆积情况自动扩缩容(Max 100并发)
- 冷启动优化 :实例空闲60秒后自动回收,结合Go运行时实现200ms级冷启动延迟,提高资源利用率。
函数运行时
上面说了这么多,只是为了介绍FaaS这种云计算架构的一些试用场景和优点。那么什么是函数运行时?
函数运行时,顾名思义就是云函数执行的运行环境,通常一个好的FaaS平台肯定是支持多种语言,如:Python/Golang/Node/java等的运行时。那么要设计和实现一个云函数运行时程序需要一些什么条件呢?
设计原则
- 云原生兼容性
- 多语言支持
- 高性能通信
云原生友好
所谓云原生友好是指对于docker/k8s平台友好,毕竟所有的函数实例都会以容器的形式部署在集群之中,而且FaaS通常是更加激进的冷启动,顾名思义也就是有请求过来的时候才启动容器:所以最重要的是启动速度,所以函数运行时最好是使用Golang语言编写。
executor
那么虽然运行时是golang编写,但是为了支持多语言的函数,运行时里面会有executor的概念,不同的executor又不同的语言代码实现,比如pyhton我们可以使用类似Flask或者FastAPI等web框架来搭建,其中的步骤逻辑可以简单的视为如下步骤:
- 运行时启动,加载用户函数配置和代码
- 判断函数类型:如果是go类型的直接在运行时调用,如果是其他语言函数则通过启动对应语言的web框架并且通过UDS加速
UDS(Unix Domain Socket)是一种在同一台主机上的进程间通信(IPC)机制,通过文件系统路径而非网络端口进行通信。相比基于 TCP/IP 的本地通信(如
127.0.0.1
),UDS 绕过了网络协议栈,减少了数据序列化、协议封装等开销,因此性能更高、延迟更低。 - 启动对应web服务加载用户代码
- 规定用户需要在main.py中实现main函数
- 然后在web框架里import main,然后将main.main赋值给self._func
- 暴露一个约定好的API:/v1/function 然后请求过来时,golang会调用 /v1/function 并触发self._func
通过UDS加速的http方式,让我们可以支持任意一种语言,当然最好是那种启动迅速的web框架。
main.go
云函数运行时的入口
mian.go的作用就是无限制的pull函数网关来获取请求。
当然真是的云函数运行时肯定比上面的过程更加复杂,但是上面的介绍可以简单的实现一个函数运行时。
函数运行时之外
虽然本文聚焦运行时实现,但完整的FaaS平台还需以下核心组件:
组件 | 核心职责 | 关键技术指标 |
---|---|---|
调度器 | 函数实例生命周期管理 | 冷启动成功率 >99.9% |
函数网关 | 协议转换与触发器适配 | 支持HTTP/MQ/Timer等8+触发器类型 |
监控系统 | 实时指标采集与异常熔断 | 秒级监控粒度 |
安全沙箱 | 防止恶意代码攻击 | 系统调用拦截率100% |
这些组件共同决定了平台的SLA水平(如AWS Lambda的300秒超时限制)和用户体验,值得后续专文探讨。
大佬受我一拜
不明觉厉
π除我佬
牛逼啊G大
我是菜鸡
装起来了
我是个渣渣
又是看不懂系列
已阅!膜拜大佬!!
不明觉厉!