1、Serverless初探:什么是Serverless、Serverless与传统架构对比、核心价值与适用场景

1.1 到底什么是Serverless?

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

嗯,这名字确实有点误导人。Serverless 不是说没有服务器,而是说你不用关心服务器。你只管写代码,至于它跑在哪台机器上、怎么扩容、怎么保证高可用——这些脏活累活,云平台替你干了。

我习惯把 Serverless 拆成两部分理解:

  • FaaS(函数即服务):你上传一段代码,比如一个 Python 函数,云平台帮你运行它。按调用次数收费,不调用不收钱。
  • BaaS(后端即服务):数据库、对象存储、认证服务这些后端能力,直接用云平台提供的,不用自己搭。

说白了,Serverless 就是一种「你只管业务逻辑,基础设施我包了」的架构模式。

核心定义:Serverless 是一种云原生开发模型,开发者只需编写和部署代码,云服务商自动管理服务器资源分配、弹性伸缩和运维。

1.2 传统架构 vs Serverless:一张表看懂

我在给团队做技术选型时,经常被问到:「Serverless 到底比传统架构好在哪儿?」

我的回答是:不是谁替代谁,而是看场景。但为了让你有个直观感受,我列个对比表:

对比维度 传统架构(虚拟机/容器) Serverless 架构
运维成本 需要自己管理 OS、补丁、监控 全托管,零运维
弹性伸缩 手动或自动,但需要提前规划 自动伸缩,从 0 到无限
计费方式 按资源占用(按时/按月) 按实际执行次数和时长
冷启动 无此问题(服务常驻) 有冷启动延迟(约 100ms-1s)
适合场景 长运行、高负载、延迟敏感 事件驱动、间歇性、短任务
调试难度 本地可完整模拟 依赖云环境,本地调试较麻烦

你想想看,传统架构就像你租了个房子,不管住不住都得付房租。Serverless 就像住酒店,按天算钱,退房就走人。

1.3 核心价值:为什么越来越多团队转向 Serverless?

我参与过好几个从传统架构迁移到 Serverless 的项目,总结下来,核心价值就三点:

1.3.1 降低运维负担

我记得有一次,团队负责一个内部工具,流量很不稳定。白天上班时间几百人用,晚上几乎没人。用传统架构,你得一直开着服务器,浪费钱。用 Serverless,晚上没人用的时候,费用直接降到零

说白了,你不用再半夜爬起来处理服务器告警了。云平台帮你搞定一切。

1.3.2 弹性伸缩是默认能力

传统架构下,你要考虑「万一流量暴增怎么办?」——加机器、配负载均衡、搞限流。Serverless 呢?自动扩缩容,从 0 到 1000 个并发,几秒钟完成。

我曾经遇到过一个场景:某个营销活动上线,流量瞬间涨了 50 倍。传统架构下,我们手忙脚乱地扩容,还是挂了半小时。后来用 Serverless 重写,同样的流量,稳如老狗

1.3.3 按需付费,成本可控

这个很好理解。你写了一个图片处理函数,每天只被调用 100 次。传统架构下,你得租一台服务器,一个月几百块。Serverless 呢?可能一个月就花几块钱

我的建议:如果你的应用流量波动大、或者处于早期阶段不确定用户量,Serverless 是绝佳选择。成本低,试错成本也低。

1.4 适用场景:什么时候该用 Serverless?

不是所有场景都适合 Serverless。我踩过坑,也见过别人踩坑。下面是我总结的最佳实践

✅ 适合的场景

  • Web API / 微服务:尤其是轻量级的 REST API,用 API Gateway + Lambda 组合,开发效率极高。
  • 数据处理管道:比如图片上传后自动压缩、视频转码、日志分析。事件驱动,天然匹配。
  • 定时任务 / 批处理:每天凌晨跑一次报表,用 Serverless 比租一台服务器划算得多。
  • Chatbot / Webhook:消息量不确定,Serverless 的弹性伸缩完美适配。
  • IoT 后端:设备上报数据,触发函数处理,按需付费。

❌ 不适合的场景

  • 长连接 / WebSocket:Serverless 函数有超时限制(通常 15 分钟),不适合长时间保持连接。
  • 高计算密集型任务:比如机器学习模型训练,跑几个小时那种,Serverless 成本反而更高。
  • 延迟极其敏感的应用:比如高频交易,冷启动那几百毫秒可能就是灾难。
  • 有状态应用:Serverless 函数是无状态的,每次调用都是全新环境。如果你需要保存状态,得借助外部存储。

避坑指南:我曾经把一个需要大量本地缓存的应用直接搬到 Serverless 上,结果性能惨不忍睹。后来才意识到,Serverless 不适合有状态的应用。如果你需要缓存,请用 Redis 或 Memcached 这类外部服务。

1.5 一个简单的例子:用 Serverless 写个图片缩略图服务

光说不练假把式。我写个最简单的例子,让你感受一下 Serverless 的开发体验。

假设我们有一个图片上传到 S3 存储桶,自动生成缩略图。用 AWS Lambda + Python 实现:

import boto3
from PIL import Image
import io

s3 = boto3.client('s3')

def lambda_handler(event, context):
    # 获取上传的图片信息
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    
    # 下载原图
    response = s3.get_object(Bucket=bucket, Key=key)
    image = Image.open(io.BytesIO(response['Body'].read()))
    
    # 生成缩略图
    image.thumbnail((200, 200))
    
    # 保存到另一个桶
    thumbnail_key = 'thumbnails/' + key
    buffer = io.BytesIO()
    image.save(buffer, 'JPEG')
    buffer.seek(0)
    
    s3.put_object(
        Bucket='my-thumbnails-bucket',
        Key=thumbnail_key,
        Body=buffer,
        ContentType='image/jpeg'
    )
    
    return {
        'statusCode': 200,
        'body': f'Thumbnail created: {thumbnail_key}'
    }

你看,整个代码不到 30 行。没有服务器配置,没有 Nginx,没有 Dockerfile。上传代码,配置触发器,完事。

这就是 Serverless 的魅力——把精力花在业务逻辑上,而不是基础设施上

1.6 小结

这一章我们聊了:

  • Serverless 不是没有服务器,而是你不用管服务器
  • 与传统架构相比,运维成本低、弹性好、按需付费
  • 适合事件驱动、间歇性任务;不适合长连接、高计算、有状态应用
  • 一个简单的图片缩略图例子,展示了 Serverless 的开发效率

下一章,我会带你深入 Serverless 的核心——函数计算(FaaS)的原理与实践。到时候我会分享一些我在生产环境中遇到的坑和解决方案。

嗯,先消化这些吧。有问题随时问我。