第一章:Serverless 基础概念——为什么我们需要它?

先聊一个我亲手踩过的坑。几年前我负责一个日志聚合服务,每天要处理几 TB 的 Nginx 访问日志。传统的做法是搭一套 Spark 集群,但运维成本高得离谱——半夜扩容、打补丁、调 JVM 参数,搞得团队苦不堪言。后来换了 Serverless 方案,代码量砍了一半,运维几乎为零。嗯,从那以后我再也没回头。

这一章我们不讲空泛的定义,而是从一个工程师的视角,把 Serverless 拆开来看:它到底是什么、主流平台怎么选、哪些场景该用它、哪些场景千万别碰。

1.1 什么是 Serverless 计算?

官方的说法叫“无服务器计算”。但你想想看,真的没有服务器吗?当然不是。服务器还在,只是你不用管了——云厂商替你搞定资源分配、扩缩容、补丁更新。你要做的只有写代码,然后上传,等着被调用就行。

我个人习惯用一个比喻来理解:传统架构像自己买车,得保养、加油、找车位;Serverless 像打网约车,车来了就用,用完下车,按里程付费。你根本不用操心车库里有没有车。

核心特征
  • 事件驱动:函数被事件触发执行(HTTP 请求、文件上传、消息队列等)。
  • 自动弹性:从 0 到上千并发,云厂商自动扩缩,你只管写逻辑。
  • 按量付费:只付实际消耗的计算时间和资源,不跑着不花钱。
  • 无状态:每个函数实例不保存上一次调用的数据,状态存外部(DB、缓存)。

为什么强调“无状态”?我曾经在项目中把用户会话直接存在函数内存里,结果下一请求被调度到另一个实例,数据丢了——排查了半天才反应过来。所以,记住:函数本身不做持久化。

小技巧:刚开始接触 Serverless 时,可以先从“事件处理函数”写起,比如处理对象存储(OSS/S3)上传事件。逻辑简单,踩坑少,很快就能感受到自动扩缩容的爽快。

1.2 主流云厂商 Serverless 产品对比

市面上三大巨头各有千秋。我用一张表帮你快速对齐关键差异。

维度 AWS Lambda 阿里云函数计算 (FC) Azure Functions
运行时支持 Node.js、Python、Java、Go、Ruby、.NET、自定义运行时 Node.js、Python、Java、Go、PHP、.NET、自定义镜像 Node.js、Python、Java、Go、PowerShell、.NET
最大执行时长 15 分钟(超时可联系提额) 最长 24 小时(预留实例) 10 分钟(默认),可无限(托管方案)
并发弹性速度 极快,数千并发秒级就绪 较快,支持预留实例预热 一般,冷启动需预热计划
最大内存 10240 MB 1536 MB(阿里云),ECI 场景可更高 1536 MB(消费计划),可自定义
触发事件源 S3、API Gateway、SQS、SNS、DynamoDB 等 200+ 事件源 OSS、API 网关、MNS、表格存储、CDN 等自研生态 Blob、Event Grid、Service Bus、Cosmos DB 等 Azure 生态
冷启动时长 约 200ms – 1s(Java/Go 稍慢) 约 300ms – 2s(依赖镜像大小) 约 500ms – 3s(消费计划较慢)
计费单位 1ms 粒度 + 请求次数 100ms 粒度 + 调用次数 1ms 粒度 + 执行次数(消费计划)
中国区友好度 需全球/中国区切换,合规较复杂 原生支持,有等保、国产化认证 由世纪互联运营,支持国内合规

你看,Lambda 生态最成熟,冷启动快,但国内用起来有些绕。阿里云 FC 对国内企业更友好,能跑长任务(比如我们做日志巡检,有时候跑半小时以上),而且预留实例功能很实用。Azure Functions 在 .NET 生态里表现优秀,但冷启动一直是个痛点。

避坑指南:我曾经贪图 Lambda 的便宜,选了 Python 运行时做日志解析,结果数据量大时被 15 分钟超时卡死,最后不得不重构成流式处理。如果你要做长时间作业(比如全量日志扫描),优先考虑阿里云 FC 的 24 小时支持,或者把任务拆成小批次。

1.3 Serverless 适用场景与局限性

既然目录叫“日志巡检自动化实战”,那 Serverless 在日志领域简直是天选之子。但别急着把所有业务都搬上去,先看清楚边界。

适用场景

  • 定时日志巡检:每天凌晨扫描昨天的错误日志,自动告警。用 CloudWatch / SLS 触发函数,写完即扔。
  • 数据 ETL 管道:日志从 OSS/对象存储进来,函数负责过滤、转换、落地到数据库或数据湖。
  • 实时报警聚合:接收日志流(Kafka / SQS),函数去重、聚合、发钉钉 / Slack 通知。
  • Webhook / API 后端:日志平台的查询接口、配置前端等轻量 API。

局限性

  • 冷启动:函数长时间不调用,下次触发需要初始化运行时和代码。对延时敏感的 API 可能受不了。
  • 执行时长限制:就算阿里云 24 小时,也扛不住真的跑几天的大数据任务。
  • 无状态:不适合需要长时间存会话或共享内存的场景(比如游戏服务器)。
  • 调试难度高:本地模拟环境与线上总有差异,尤其是事件源和权限问题。我经常花了半天才发现是 IAM Role 没配好。
  • 费用陷阱:高并发下调用次数和运行时长账单可能猛涨。记得设预算告警。
个人经验:如果你做日志巡检,建议先把离线、可分批的任务丢上去。比如全量日志扫描,我习惯按分钟窗口切片,每个函数处理 1 分钟的数据,超时风险为 0,也很容易调试。

说到这,我画了一张知识体系图,帮你把第一章的核心概念串联起来。你看一遍就能记住。

Serverless 核心知识体系 Serverless 计算 事件驱动 自动弹性 按量付费 无状态 AWS Lambda 阿里云 FC Azure Functions 适用场景 局限性(冷启动/时长/状态) 日志巡检 / ETL / API 调试难 / 费用陷阱 / 无状态 图中重点:先理解概念特征,再对比产品差异,最后卡好场景边界,避开局限性。