Serverless 与边缘计算
问题
什么是 Serverless?边缘计算在前端场景中有什么应用?
答案
Serverless 概念
Serverless 并非"无服务器",而是开发者不需要关心服务器的运维。云平台自动管理底层基础设施,开发者只需编写业务逻辑。
Serverless 的核心特点
| 特性 | 说明 |
|---|---|
| 按需执行 | 有请求才运行,空闲不计费 |
| 自动扩缩 | 流量高峰自动扩容,低谷自动缩容 |
| 无状态 | 每次执行是独立的,不保留内存状态 |
| 冷启动 | 首次调用有延迟(100ms ~ 数秒) |
| 执行时限 | 通常有最大执行时间限制(5s ~ 15min) |
FaaS 函数即服务
api/hello.ts — Vercel Serverless Function
import type { VercelRequest, VercelResponse } from '@vercel/node';
export default function handler(req: VercelRequest, res: VercelResponse) {
const { name } = req.query;
res.status(200).json({ message: `Hello ${name || 'World'}!` });
}
functions/hello.ts — Cloudflare Workers
export default {
async fetch(request: Request): Promise<Response> {
const url = new URL(request.url);
const name = url.searchParams.get('name') || 'World';
return new Response(JSON.stringify({ message: `Hello ${name}!` }), {
headers: { 'Content-Type': 'application/json' },
});
},
};
边缘计算(Edge Computing)
边缘计算是将代码部署到离用户最近的 CDN 节点执行,响应延迟极低(通常 < 50ms)。
| 平台 | 产品 | 运行时 | 冷启动 |
|---|---|---|---|
| Vercel | Edge Functions | V8 Isolates | ~0ms |
| Cloudflare | Workers | V8 Isolates | ~0ms |
| AWS | Lambda@Edge | Node.js | 100ms+ |
| Netlify | Edge Functions | Deno | ~0ms |
前端常见 Serverless 场景
middleware.ts — Next.js Edge Middleware
import { NextRequest, NextResponse } from 'next/server';
export function middleware(request: NextRequest) {
// 1. 地理位置重定向
const country = request.geo?.country || 'US';
if (country === 'CN') {
return NextResponse.redirect(new URL('/zh', request.url));
}
// 2. A/B 测试
const bucket = Math.random() < 0.5 ? 'a' : 'b';
const response = NextResponse.next();
response.cookies.set('ab-test', bucket);
// 3. 认证检查
const token = request.cookies.get('token');
if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
return NextResponse.redirect(new URL('/login', request.url));
}
return response;
}
export const config = {
matcher: ['/((?!_next/static|favicon.ico).*)'],
};
冷启动优化
冷启动
冷启动是 Serverless 最大的性能瓶颈,以下是优化方法:
| 策略 | 说明 |
|---|---|
| 减小包体积 | 精简依赖,只打包必要代码 |
| 预热(Provisioned) | 保持一定数量的热实例 |
| 选择 Edge Runtime | V8 Isolates 冷启动接近 0ms |
| 避免大型依赖 | SDK 选择轻量版本 |
| 连接池复用 | 数据库连接放在函数外部 |
常见面试问题
Q1: Serverless 适合什么场景?不适合什么?
答案:
| 适合 | 不适合 |
|---|---|
| API 接口 | 长时间运行的任务 |
| SSR/SSG | WebSocket 长连接 |
| 定时任务 | 需要大量本地状态 |
| 图片处理 | 高性能计算 |
| Webhook | 需要持久化内存的服务 |
Q2: Edge Function 和普通 Serverless Function 的区别?
答案:
- 普通 Serverless:部署在特定区域(如 us-east-1),完整 Node.js 运行时,冷启动有延迟
- Edge Function:部署在全球 CDN 节点,V8 Isolates 运行时,冷启动接近 0ms,但 API 受限(不支持完整 Node.js API)
Q3: 如何处理 Serverless 中的数据库连接?
答案:
传统连接池在 Serverless 中会导致连接数暴涨。解决方案:
- 使用连接池代理(如 PgBouncer、Prisma Accelerate)
- 使用 HTTP 数据库(如 Neon、PlanetScale、Turso)
- 在函数外部初始化连接(Lambda 容器复用时可复用连接)
Q4: Vercel、Netlify、Cloudflare Workers 怎么选?
答案:
| 维度 | Vercel | Netlify | Cloudflare Workers |
|---|---|---|---|
| 框架亲和 | Next.js 最佳 | 框架无关 | 框架无关 |
| 边缘运行时 | ✅ | ✅ | ✅(全球最快) |
| 免费额度 | 慷慨 | 慷慨 | 非常慷慨 |
| 数据库生态 | Vercel KV/Postgres | 无内置 | D1/KV/R2 |
| 适用场景 | 全栈 Next.js | 静态站 + Functions | API 密集型 |
Q5: 前端工程师需要关注 Serverless 吗?
答案:
非常需要。现代前端框架(Next.js、Nuxt、Remix)都深度依赖 Serverless:
- SSR 运行在 Serverless Function 上
- Edge Middleware 用于路由拦截、A/B 测试
- API Routes 让前端可以写轻量后端逻辑
- ISR(增量静态再生) 依赖 Serverless 触发重新构建
相关链接
- Vercel Serverless 文档
- Cloudflare Workers 文档
- SSR 与 SSG - 服务端渲染部署方式
- Next.js 核心知识 - Next.js 中的 Serverless