设计一个 FASS 架构中的云函数运行时

Faas 架构

在现代云计算的范畴里,FaaS 是一个比较新潮的概念,在 FaaS 里面用户只需要关注自己的代码逻辑,可能是一个函数或者是一个脚本,不用关注底层的资源或者程序运行所需的运行时。也不用关注资源负载和流量并发度和 100% 免运维体验,因为这些 FaaS 都帮我们解决了,这通常意味着开发周期更短。

我目前在开发一个 RAG 平台,其中新增知识功能需要对录入的知识进行分片,Embedding,保存到向量数据库,这个过程比较耗费时间,而且需要扩展性,比如未来需要支持扩展其他的 Embedding 模型,如多模态等。所以我需要开发一个异步 Task 任务系统来保证知识入库任务异步化。而且能够承载海量的知识入库任务。

FaaS 就完美解决了我这些问题

  1. 我的 RAG API 只需要接受前端传过来将知识录入扔入消息队列中,而我的 Task 处理函数则监听这个消息队列
  2. 通过 FaaS 平台我可以自由设置资源占用并发度,比如 2C2G,最多同时处理 100 个任务
  3. 而且函数是冷启动,1 分钟空闲则销毁容器,启动时间毫秒级。提高资源利用率。

函数运行时

上面说了这么多,只是为了介绍 FaaS 这种云计算架构的一些试用场景和优点。那么什么是函数运行时?

函数运行时,顾名思义就是云函数执行的运行环境,通常一个好的 FaaS 平台肯定是支持多种语言,如:Python/Golang/Node/java 等的运行时。那么要设计和实现一个云函数运行时程序需要一些什么条件呢?

云原生友好

所谓云原生友好是指对于 docker/k8s 平台友好,毕竟所有的函数实例都会以容器的形式部署在集群之中,而且 FaaS 通常是更加激进的冷启动,顾名思义也就是有请求过来的时候才启动容器:所以最重要的是启动速度,所以函数运行时最好是使用 Golang 语言编写。

executor

那么虽然运行时是 golang 编写,但是为了支持多语言的函数,运行时里面会有 executor 的概念,不同的 executor 又不同的语言代码实现,比如 pyhton 我们可以使用类似 Flask 或者 FastAPI 等 web 框架来搭建,其中的步骤逻辑可以简单的视为如下步骤:

  1. 运行时启动,加载用户函数配置和代码
  2. 判断函数类型:如果是 go 类型的直接在运行时调用,如果是其他语言函数则通过启动对应语言的 web 框架并且通过 UDS 加速

    UDS(Unix Domain Socket)是一种在同一台主机上的进程间通信(IPC)机制,通过文件系统路径而非网络端口进行通信。相比基于 TCP/IP 的本地通信(如 127.0.0.1),UDS 绕过了网络协议栈,减少了数据序列化、协议封装等开销,因此性能更高、延迟更低。

  3. 启动对应 web 服务加载用户代码
    1. 规定用户需要在 main.py 中实现 main 函数
    2. 然后在 web 框架里 import main,然后将 main.main 赋值给 self._func
    3. 暴露一个约定好的 API:/v1/function 然后请求过来时,golang 会调用 /v1/function 并触发 self._func

通过 UDS 加速的 http 方式,让我们可以支持任意一种语言,当然最好是那种启动迅速的 web 框架。

main.go

云函数运行时的入口

mian.go 的作用就是无限制的 pull 函数网关来获取请求。

当然真是的云函数运行时肯定比上面的过程更加复杂,但是上面的介绍可以简单的实现一个函数运行时。

函数运行时之外

函数运行时之外,FaaS 这种架构还有非常多更重要的概念,如调度器,函数网关等,这些概念甚至比运行时更重要,因为这些决定了一个 FaaS 平台最重要的用户体验和适用范围:调度器代表了平台函数实例的调度伸缩/启动时间等,而函数网关则代表平台支持的函数触发方式,http/rpc/消息队列以及扩容策略和限流策略等,通过函数网关屏蔽了处罚方式的差异,让函数运行时从网关获取请求之后只关注逻辑处理和性能优化。至于为什么我不谈?因为我还没有深入了解 🫡,我太菜了!

  • FaaS
    2 引用 • 2 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖 • 3 关注
  • Serverless
    4 引用
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    501 引用 • 1395 回帖 • 247 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...