一、无服务器计算概述:什么是无服务器架构、与传统架构对比、核心优势与适用场景

1.1 到底什么是无服务器架构?

说实话,我第一次听到「无服务器」这个词,第一反应是:没服务器?那代码跑哪儿?

后来才明白,这名字起得有点误导人。无服务器架构,不是真的没有服务器,而是你不需要关心服务器。说白了,就是云厂商把服务器、操作系统、运行时环境全都替你管了。你只需要写代码,上传,然后等着它跑起来就行。

我个人习惯把无服务器架构理解为:事件驱动的、按需执行的、全托管的计算模式。你写一个函数,当某个事件发生(比如 HTTP 请求、文件上传、数据库变更),这个函数就被自动触发执行。执行完,资源就释放了。你不需要提前开一台虚拟机等着,也不需要操心扩缩容。

嗯,这里要注意:无服务器 ≠ 没有服务器,而是服务器对你不可见。就像你用电,不需要关心发电厂在哪儿,一个道理。

核心定义:无服务器计算是一种云计算执行模型,云提供商动态管理机器资源的分配。计费基于实际消耗的资源量,而非预购的容量。

1.2 与传统架构的对比

我刚开始做后端开发那会儿,用的都是传统架构。买服务器、装系统、配环境、部署应用、监控告警……一套流程下来,少说一周。而且最头疼的是容量规划——你永远不知道明天流量是涨还是跌。

下面这张表,是我这些年切换架构时总结的对比,你可以感受一下差异:

对比维度 传统架构(服务器/容器) 无服务器架构
基础设施管理 需要自己管理服务器、网络、存储 完全由云厂商管理
扩缩容方式 手动或基于规则自动扩缩 自动、弹性、秒级扩缩
计费模式 按预购资源付费(即使空闲) 按实际执行次数和时长付费
部署复杂度 需要配置环境、依赖、运行时 上传代码即可,运行时由平台提供
冷启动问题 无(服务常驻) 有(首次调用有延迟)
执行时长限制 无限制(可长时间运行) 通常有超时限制(如 15 分钟)
状态管理 可本地存储状态 无状态,需借助外部存储

你看,传统架构像自己买车——不管开不开,保养、保险、停车费一样不少。无服务器架构像打车——用了才付钱,不用就零成本。但打车也有缺点,高峰期可能等车(冷启动),而且不能开长途(执行时长限制)。

1.3 核心优势

我在项目中遇到过不少团队,从传统架构迁移到无服务器后,最直观的感受就是:运维工作量直线下降。具体来说,有这几个核心优势:

  • 零运维:不用再半夜爬起来处理服务器告警。云厂商负责打补丁、升级系统、保证高可用。你只管写业务代码。
  • 弹性伸缩:流量从 0 到 10 万并发,无服务器架构能自动秒级扩缩。我记得有一次双十一活动,我们的函数实例数从几十个瞬间飙到几千个,完全没人工干预。
  • 按需付费:这是最实在的好处。一个低频调用的 API,传统架构也得开一台服务器每月几百块。无服务器架构可能一个月只花几毛钱。
  • 快速迭代:部署一个函数只需要几秒钟。我经常一天部署十几次,这在传统架构下根本不敢想。

小技巧:如果你刚开始接触无服务器,建议从简单的、低频的、无状态的业务开始尝试。比如图片处理、数据清洗、Webhook 回调等。不要一上来就把核心交易系统搬上去,容易踩坑。

1.4 适用场景

无服务器架构不是万能的。你想想看,如果所有业务都适合,那传统架构早该消失了。根据我的经验,以下场景特别适合:

  • 事件驱动型任务:比如文件上传后自动压缩、数据库变更后触发通知、定时任务等。这些任务天然就是「来活就干,干完就歇」。
  • API 后端:尤其是 RESTful API 或 GraphQL 接口。配合 API 网关,可以快速搭建一个高可用的后端服务。
  • 数据处理管道:实时流处理、ETL 任务、日志分析等。无服务器函数可以串联成一条处理链。
  • 微服务架构中的轻量服务:那些逻辑简单、调用频率不固定的服务,用无服务器实现比维护一个完整服务划算得多。
  • 原型验证和 MVP:快速验证一个想法,不需要投入大量基础设施成本。我经常用无服务器搭原型,验证通过再考虑是否迁移到更重的架构。

但也要注意,不是所有场景都适合。我曾经踩过一个坑:把一个需要长时间运行的计算任务部署成函数,结果执行到一半被超时中断了。后来才意识到,无服务器函数通常有执行时长限制(比如 AWS Lambda 是 15 分钟)。所以,长时间运行的任务、有状态的应用、对延迟极其敏感的场景,还是要慎重。

避坑指南:我曾经把一个需要维护 WebSocket 长连接的服务直接搬上无服务器,结果发现函数执行完连接就断了。后来不得不改用 API Gateway 的 WebSocket 支持 + 状态管理服务才搞定。记住:无服务器天生无状态,需要状态管理的场景一定要提前设计好外部存储方案。

1.5 一个简单的例子

说了这么多,不如看个代码。下面是一个用 AWS Lambda 实现的图片缩略图生成函数,用 Node.js 写的:

// 当图片上传到 S3 桶时,自动生成缩略图
const AWS = require('aws-sdk');
const sharp = require('sharp');

const s3 = new AWS.S3();

exports.handler = async (event) => {
  // 从事件中获取上传的文件信息
  const bucket = event.Records[0].s3.bucket.name;
  const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
  
  // 读取原图
  const originalImage = await s3.getObject({
    Bucket: bucket,
    Key: key
  }).promise();
  
  // 用 sharp 生成 200x200 的缩略图
  const thumbnail = await sharp(originalImage.Body)
    .resize(200, 200)
    .toBuffer();
  
  // 保存缩略图到另一个目录
  const thumbnailKey = `thumbnails/${key.split('/').pop()}`;
  await s3.putObject({
    Bucket: bucket,
    Key: thumbnailKey,
    Body: thumbnail,
    ContentType: 'image/jpeg'
  }).promise();
  
  return {
    statusCode: 200,
    body: `Thumbnail generated: ${thumbnailKey}`
  };
};

你看,整个函数不到 30 行代码。不需要配置服务器,不需要安装操作系统,不需要操心并发。上传一张图片,函数自动触发,生成缩略图,然后结束。这就是无服务器的魅力——你只关心业务逻辑,剩下的交给平台

好了,这一章我们聊了无服务器架构的基本概念、与传统架构的对比、核心优势和适用场景。下一章,我会带你深入看看无服务器架构的冷启动问题——这可是性能调优的第一个大坑。