Serverless

狭义 Serverless(最常见)= Serverless computing 架构 = FaaS 架构 = Trigger(事件驱动)+ FaaS(函数即服务)+ BaaS(后端即服务,持久化或第三方服务)= FaaS + BaaS

广义 Serverless = 服务端免运维 = 具备 Serverless 特性的云服务

FaaS

函数计算架构

分层

分层的好处在于容器可以被预热,并且缓存,资源可以统筹优化,公共服务能力可以被提取

当一段时间内没有用户请求时,则会销毁函数实例,这样子可以达到缩容为 0

运行时主要做三件事:

冷启动

冷启动

预热冷启动:利用构建好的缓存镜像,直接跳过冷启动的下载函数代码步骤,从镜像启动容器

平台侧的优化:

用户侧的优化:

灰度发布

sequenceDiagram    participant 用户    participant HTTP 触发器    participant 函数计算平台    participant 别名    participant 主版本    participant 新版本    用户 ->> HTTP 触发器: 发起请求    HTTP 触发器 ->> 函数计算平台: 解析请求    函数计算平台 -->> HTTP 触发器: 返回版本号    HTTP 触发器 ->> 别名: 解析版本号    别名 ->> 主版本: 处理请求    主版本 -->> 别名: 返回结果    别名 -->> HTTP 触发器: 返回结果    HTTP 触发器 -->> 用户: 返回结果    alt 需要切换流量至新版本        用户 ->> 函数计算平台: 请求切换流量        函数计算平台 ->> 别名: 更新别名指向新版本        别名 -->> 用户: 切换成功    else 不需要切换流量        用户 ->> 函数计算平台: 请求不切换流量        函数计算平台 -->> 用户: 操作完成    end    用户 ->> HTTP 触发器: 发起请求    HTTP 触发器 ->> 函数计算平台: 解析请求    函数计算平台 -->> HTTP 触发器: 返回版本号    HTTP 触发器 ->> 别名: 解析版本号    别名 ->> 主版本: 处理请求    主版本 -->> 别名: 返回结果    别名 -->> HTTP 触发器: 返回结果    HTTP 触发器 -->> 用户: 返回结果

削峰容灾

sequenceDiagram    participant 请求方    participant 消息队列    participant 函数计算平台    participant 后端资源池    participant 容灾队列    participant 容灾处理函数    请求方 ->> 消息队列: 发起请求    消息队列 ->> 函数计算平台: 接收请求    函数计算平台 ->> 后端资源池: 调度请求    后端资源池 -->> 函数计算平台: 返回处理结果    函数计算平台 -->> 请求方: 返回结果    alt 削峰处理        请求方 ->> 消息队列: 发起突增流量请求        消息队列 ->> 函数计算平台: 接收突增流量请求        函数计算平台 ->> 后端资源池: 调度突增流量请求        后端资源池 -->> 函数计算平台: 返回处理结果        函数计算平台 -->> 请求方: 返回结果    else 容灾处理        请求方 ->> 消息队列: 发起请求        消息队列 ->> 函数计算平台: 接收请求        函数计算平台 ->> 后端资源池: 调度请求        后端资源池 -->> 函数计算平台: 返回错误信息        函数计算平台 ->> 容灾队列: 将错误信息发送到容灾队列        容灾队列 ->> 容灾处理函数: 接收错误信息        容灾处理函数 -->> 后端资源池: 重新调度请求        后端资源池 -->> 容灾处理函数: 返回处理结果        容灾处理函数 -->> 请求方: 返回结果    end

进程模型

触发器

sequenceDiagram    participant 用户    participant 函数计算平台    participant MinIO    participant 事件监听器    participant 数据库MySQL    participant 远端云函数    用户->>函数计算平台: 绑定自定义触发器    Note over 函数计算平台: 设置事件源标识    loop 监听事件        MinIO->>事件监听器: 发生上传文件动作        事件监听器->>数据库MySQL: 查询触发器        数据库MySQL-->>事件监听器: 返回触发器信息        loop 逐个触发触发器            事件监听器->>远端云函数: 触发调用            Note over 远端云函数: 执行相应操作            远端云函数-->>事件监听器: 返回结果        end    end

触发器类型:单向集成触发器、双向集成触发器和代理集成触发器。它们的区别在于事件源和事件的规则存储在哪里,以及从哪里触发

扩缩容

云厂商容器调度服务通常有两种调度形态,一种是基于节点 Node 调度的方式,一种是基于容器实例的方式

graph TD;    A[选择指标] --> B[收集指标];    B --> C[决策扩缩容];    C --> D[执行扩缩容];    D --> E[资源调整];    C --> F[调度方式];    F --> G[及时扩容];    F --> H[延时扩容];    C --> I[决策模式];    I --> J[稳定模式];    I --> K[恐慌模式];    J --> L[资源数量维护];    K --> L;

流量转发

冷启动下的流量转发

异步下的流量转发主要通过事件 / 消息队列的方式来缓冲一步,然后通过异步处理模块,按照同步请求的请求机制来处理

数据编排

前端的一个数据请求过来,函数触发器触发我们的函数服务;我们的函数启动后,调用后端提供的元数据接口,并将返回的元数据加工成前端需要的数据格式

服务编排

和数据编排很像,主要区别是对云服务商提供的各种服务进行组合和加工。这些步骤通常通过 JSON 或者 YAML 的格式定义好函数之间的协作关系存在,通过顺序、分支、并行的方式来协调一个或多个分布式任务,这些任务不仅包括函数,还可以是服务和应用的形式,并且还能使用平台提供的状态跟踪、日志记录和异常重试逻辑

数据存储

控制面:

数据面:

BaaS

FaaS 提供业务逻辑层的处理,BaaS 提供基础服务层的能力,让有状态的数据、过程消息等存储在 BaaS 化的服务中,BaaS 弥补了 FaaS 的无状态,数据库、消息队列都可以 BaaS 化,可以拥有自己的生命周期,使用完即销毁

私有Serverless

平台设计

函数管理

平台管控

资源控制

用户角色和权限管理

高可用

可观测