直接跳到内容

云函数

云函数是一项基于 Serverless (无服务器) 架构的计算服务,它提供 FaaS (Function as a Service) 能力,让开发者能够将开发测试的对象聚焦到函数级别。开发者只需编写函数代码并部署到云端,无需购买、搭建和管理服务器,云函数会根据实际流量进行弹性伸缩,自动处理基础设施的管理和维护。

核心概念与工作原理

云函数的核心思想是事件驱动的函数即服务。开发者编写独立的函数代码,云平台负责在有事件触发时执行这些函数。

基本工作流程:

事件触发 → 资源分配 → 执行函数 → 返回结果 → 释放资源
    ↑          ↓          ↓          ↓         ↓
 HTTP请求   分配计算   运行业务   输出响应   回收计算
 消息队列   资源实例   逻辑代码   数据     资源

物理设计上,一个云函数可由多个文件组成,占用一定量的 CPU 内存等计算资源;各云函数完全独立;可分别部署在不同的地区。

每个云函数都在自己的容器中运行,平台自动管理底层计算资源。当函数被触发时,云平台会分配必要的内存和 CPU 资源,函数运行结束后,这些资源会被回收。

主要特点

无需服务器管理

云函数将服务器管理、资源调度和监控运维完全交由云平台处理:

  • 免服务器管理:自动处理服务器配置、部署、监控
  • 自动扩缩容:根据请求量自动调整实例数量
  • 高可用保障:内置负载均衡和故障转移机制

事件驱动与多种触发方式

云函数基于事件触发模型完成消息的收发及业务处理,支持多种触发方式:

  • HTTP 请求 (通过 API 网关)
  • 消息队列 (如 CKafka)
  • 定时触发器 (使用 cron 表达式)
  • 云存储事件 (如文件上传)
  • 数据库变更

自动弹性伸缩

云函数具备强大的自动扩缩容能力:

  • 快速启动:毫秒级冷启动,快速响应用户请求
  • 自动扩缩容:根据请求量自动调整实例数量
  • 按需扩容:从零到数千实例的秒级扩展能力

精细化的按需计费

云函数采用按实际使用量计费的模式:

  • 零闲置成本:只在函数实际执行时计费,空闲时零费用
  • 按执行时间计费:按函数运行时长和配置内存付费
  • 按调用次数计费:根据函数被调用的次数计费

多语言支持

主流云函数平台支持多种编程语言:

语言版本支持特点
Node.js12.x, 14.x, 16.x, 18.x生态丰富,适合快速开发
Python3.6, 3.7, 3.9数据处理能力强,AI/ML 友好
Java8, 11企业级应用,性能稳定
Golang1.x高性能,并发处理优秀
PHP7.2, 8.0Web 开发友好

函数类型与开发模式

事件函数 (Event Function)

适合处理事件驱动的业务逻辑:

  • 专注业务逻辑,无需关心 HTTP 协议细节
  • 支持多种触发方式 (SDK、HTTP、定时器)
  • 简单的入参和返回值格式
javascript
// 示例:温度转换事件函数
import function_sdk
import json

cli = function_sdk.EdgeClient()

def handler(event, context):
    # 获取消息内容
    msg = json.loads(event["payload"].decode('utf-8'))

    # 业务逻辑:摄氏温度转华氏温度
    if msg["celsius"] > 100:
        msg["fahrenheit"] = msg["celsius"] * 1.8 + 32
        payload = json.dumps(msg).encode('utf-8')

        # 向指定 topic 发送消息
        cli.publish("converted_topic", payload)

Web 云函数 (Web Function)

适合构建完整的 Web 应用和 API 服务:

  • 完整的 HTTP 请求/响应处理能力
  • 支持主流 Web 框架 (Express.js、Koa.js)
  • 支持 SSE、WebSocket 等实时通信
javascript
// 示例:Express.js Web 函数
const express = require('express')
const app = express()

app.get('/api/users', async (req, res) => {
  const users = await ctx.mpserverless.db.collection('users').find()
  res.json(users)
})

exports.main = app

典型应用场景

弹性伸缩的 API 后端

云函数特别适合构建弹性伸缩的 API 后端服务

客户端 → API网关 → 云函数 → 数据库

      自动伸缩处理流量波动

当使用云函数 SCF 构建 API 时,SCF 函数的一次执行可以处理一个 HTTP 请求。云函数 SCF 会根据对单个函数的需求自动进行弹性伸缩。

实时文件处理

云函数可用于实时文件处理和转换

文件上传 → 触发函数 → 处理文件 → 存储结果

图片压缩、格式转换、内容审核

云函数可以轻松与云存储服务集成,在文件被创建或更新时触发函数。

数据处理与 ETL

适合数据清洗、转换和加载任务:

  • 数据验证和清洗
  • 格式转换
  • 实时数据分析

自动化任务与定时作业

凭借其事件驱动特性和灵活性,云函数 SCF 非常适合用于将那些不需要让整个服务器一直运行的业务自动化。例如执行定时任务

技术优势与局限性

核心优势

  1. 降低成本:云函数可以大幅度降低开发成本,按实际使用量计费,无需为闲置资源付费
  2. 提升开发效率:开发者只需关注业务逻辑代码,云函数提供了高效可靠的函数开发与运行框架
  3. 简化运维:完全托管的基础设施,自动处理扩缩容、监控和故障恢复
  4. 高可用性与弹性:内置跨可用区部署和自动容错机制

挑战与局限性

  1. 冷启动延迟:函数实例首次创建或长时间未使用时会有初始化延迟,通过快照恢复预测预热技术可降低影响
  2. 执行时间限制:函数通常有最大执行时间限制 (如 15 分钟)
  3. 状态管理:函数实例是无状态的,需要依赖外部存储保存状态数据
  4. 调试复杂性:分布式环境下的调试和日志收集较为复杂

开发与部署流程

基本开发流程

云函数的典型开发流程包括:

  1. 创建函数:在云平台创建函数,指定名称、运行环境和资源规格
  2. 编写代码:按照函数签名编写业务逻辑
javascript
// 函数基本结构
exports.main = async function (event, context) {
  // 从event参数获取触发事件数据
  const { httpMethod, path, headers, body } = event

  // 业务逻辑处理
  const result = await processRequest(body)

  // 返回响应
  return {
    statusCode: 200,
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(result),
  }
}
  1. 本地测试:使用命令行工具本地运行和调试函数
  2. 部署上线:将函数代码打包部署到云端

函数调用方式

云函数支持多种调用方式:

  • SDK 调用:使用各平台提供的 SDK 调用函数
javascript
// 小程序中调用云函数示例
mpServerless.function
  .invoke('getImageList', {
    username: 'Vincent',
  })
  .then((res) => {
    if (res.success && res.result) {
      this.setData({ imageList: res.result.images })
    }
  })
  • HTTP 触发:通过 API 网关提供 HTTP 接口
  • 内部调用:云函数之间可以互相调用
云函数已经加载完毕