Faas 架构
在现代云计算的范畴里,FaaS 是一个比较新潮的概念,在 FaaS 里面用户只需要关注自己的代码逻辑,可能是一个函数或者是一个脚本,不用关注底层的资源或者程序运行所需的运行时。也不用关注资源负载和流量并发度和 100% 免运维体验,因为这些 FaaS 都帮我们解决了,这通常意味着开发周期更短。
我目前在开发一个 RAG 平台,其中新增知识功能需要对录入的知识进行分片,Embedding,保存到向量数据库,这个过程比较耗费时间,而且需要扩展性,比如未来需要支持扩展其他的 Embedding 模型,如多模态等。所以我需要开发一个异步 Task 任务系统来保证知识入库任务异步化。而且能够承载海量的知识入库任务。
FaaS 就完美解决了我这些问题
- 我的 RAG API 只需要接受前端传过来将知识录入扔入消息队列中,而我的 Task 处理函数则监听这个消息队列
- 通过 FaaS 平台我可以自由设置资源占用并发度,比如 2C2G,最多同时处理 100 个任务
- 而且函数是冷启动,1 分钟空闲则销毁容器,启动时间毫秒级。提高资源利用率。
函数运行时
上面说了这么多,只是为了介绍 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 这种架构还有非常多更重要的概念,如调度器,函数网关等,这些概念甚至比运行时更重要,因为这些决定了一个 FaaS 平台最重要的用户体验和适用范围:调度器代表了平台函数实例的调度伸缩/启动时间等,而函数网关则代表平台支持的函数触发方式,http/rpc/消息队列以及扩容策略和限流策略等,通过函数网关屏蔽了处罚方式的差异,让函数运行时从网关获取请求之后只关注逻辑处理和性能优化。至于为什么我不谈?因为我还没有深入了解 🫡,我太菜了!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于